Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / INSERT INTO ON CONFLICT / 7 сообщений из 7, страница 1 из 1
29.01.2016, 20:58
    #39158954
kolts
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT INTO ON CONFLICT
В 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
29.01.2016, 21:20
    #39158969
p2.
p2.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT INTO ON CONFLICT
koltsукоротить записьчернила в клавиатуре экономишь? можешь сэкономить на знаках равенства за счет запятых.
...
Рейтинг: 0 / 0
29.01.2016, 21:28
    #39158975
kolts
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT INTO ON CONFLICT
Нужно это прописать где то для 10 таблиц. Где то 1 час скучной работы. Если нет более короткой записи сделаю без проблем но для общего развития хочется знать.
Вам же лучше остроумие экономить, а то заканчивается.
...
Рейтинг: 0 / 0
29.01.2016, 23:11
    #39159016
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT INTO ON CONFLICT
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
29.01.2016, 23:52
    #39159032
kolts
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT INTO ON CONFLICT
Придется для всех полей писать set = exclided.value, мы же не знаем какие из них поменялись. А полей может быть 40 или 50 (у меня пока максимум в моей программе 33), получается надо все поля присвоить кроме одного, по которому идет проверка на уникальность. Это конечно мелочи, но думал может быть есть что то удобнее чем сначала делать вставку нескольких десятков полей, а потом этим же нескольким десяткам полей присваивать значения.
Возможно скоро появится синтаксис on conflict (column) do update, что будет подразумевать обновить все остальные.
...
Рейтинг: 0 / 0
30.01.2016, 15:16
    #39159191
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT INTO ON CONFLICT
kolts,
резюмируя -- вы хотите синтакс
Код: sql
1.
SET (*) = [SELECT] (EXCLUDED.*)


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


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


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


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