powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / INSERT INTO ON CONFLICT
7 сообщений из 7, страница 1 из 1
INSERT INTO ON CONFLICT
    #39158954
kolts
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В 9.5 версии появился так называемый upsert
Пример из хелпа:
Код: sql
1.
2.
3.
INSERT INTO distributors (did, dname)
    VALUES (5, 'Gizmo Transglobal'), (6, 'Associated Computing, Inc')
    ON CONFLICT (did) DO UPDATE SET dname = EXCLUDED.dname;


У меня в таблице около 20 колонок, можно как-то укоротить запись чтоб не писать для каждой колонки чему она равна.
...
Рейтинг: 0 / 0
INSERT INTO ON CONFLICT
    #39158969
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
koltsукоротить записьчернила в клавиатуре экономишь? можешь сэкономить на знаках равенства за счет запятых.
...
Рейтинг: 0 / 0
INSERT INTO ON CONFLICT
    #39158975
kolts
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужно это прописать где то для 10 таблиц. Где то 1 час скучной работы. Если нет более короткой записи сделаю без проблем но для общего развития хочется знать.
Вам же лучше остроумие экономить, а то заканчивается.
...
Рейтинг: 0 / 0
INSERT INTO ON CONFLICT
    #39159016
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolts,

Как администратор скажу, что очень много проблем приходит от желания разработчиков сэкономить (это общее наблюдение, не воспринимайте лично). Потратить не 3 минуты на копипаст, а 15 на нормальное написание запроса очень неплохо, если предполагается, что запрос потом долгое время работать в продукции и не доставлять боли. И пока не окажешься в шкуре того, кто решает проблемы в продукции, а не в юнит-тестах — об этом не задумываешся.

В данном случае `did` скорее всего ключ и, соответственно, на нём индекс.
Если индекса на `dbname` нет и сделать как в доке, то вы получите HOT update.

Если выкрутиться и сделать как проще (сэкономить 10 минут), то сокрее всего запись будет меняться целиком, включая все индексные поля. Тот факт, что значение (скажем `did`) не меняется (меняется на такое же), базу не волнует — изменит, при этом обновив все индесы.

Дольше UPDATE, больше блокировок, больше индексы, дольше vaccum.


По существу. На той же странице в доке, в самом верху, есть все возможные варианты:
http://www.postgresql.org/docs/current/interactive/sql-insert.html and conflict_action is one of:

DO NOTHING
DO UPDATE SET { column_name = { expression | DEFAULT } |
( column_name [, ...] ) = ( { expression | DEFAULT } [, ...] ) |
( column_name [, ...] ) = ( sub-SELECT )
} [, ...]
[ WHERE condition ]
Я не вижу вариантов как сделать короче...
...
Рейтинг: 0 / 0
INSERT INTO ON CONFLICT
    #39159032
kolts
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Придется для всех полей писать set = exclided.value, мы же не знаем какие из них поменялись. А полей может быть 40 или 50 (у меня пока максимум в моей программе 33), получается надо все поля присвоить кроме одного, по которому идет проверка на уникальность. Это конечно мелочи, но думал может быть есть что то удобнее чем сначала делать вставку нескольких десятков полей, а потом этим же нескольким десяткам полей присваивать значения.
Возможно скоро появится синтаксис on conflict (column) do update, что будет подразумевать обновить все остальные.
...
Рейтинг: 0 / 0
INSERT INTO ON CONFLICT
    #39159191
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolts,
резюмируя -- вы хотите синтакс
Код: sql
1.
SET (*) = [SELECT] (EXCLUDED.*)


/*годное и для NEW */
скопки -- опционально. м.б. row(*)=row(record.*)


-- лоббируйте. идея здравая,
http://www.sql.ru/forum/820306/golosuem-za-novye-fichi-pg
...
Рейтинг: 0 / 0
INSERT INTO ON CONFLICT
    #39159197
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗЫ пока это делается массовым [регексп]реплайсом из описания табличного типа -- немного выдумки -- напишете генератор. то, что писал одмин вегоров в этом случае не канает, тут именно * рулила бы. -- тип копируется в себя и только в себя.


хотя если это было бы потенциально 2 разные типа -- то на случай ALTER одного из 2-х возникают варианты, -- или вам бы хотелось, чтобы всё сломалось, чтобы привести к соответстию заложенную логику, и оно ни разу бы неправильно не сработало -- тогда * была бы логически вернее, даже для одминов. Или вы хотели бы , чтобы оно продолжало работать как написано, тогда строгое перечисление было бы верным подходом.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / INSERT INTO ON CONFLICT
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]