В PostgreSQL 9.5 и новее вы можете использовать INSERT ... ON CONFLICT UPDATE
.
См. документацию .
MySQL INSERT ... ON DUPLICATE KEY UPDATE
можно прямо перефразировать до a ON CONFLICT UPDATE
. Синтаксис SQL-стандарта не является, они оба расширения для конкретной базы данных. Есть веские причины MERGE
не использовались для этого , новый синтаксис не был создан только для удовольствия. (Синтаксис MySQL также имеет проблемы, которые означают, что он не был принят напрямую).
, например. заданная настройка:
CREATE TABLE tablename (a integer primary key, b integer, c integer);
INSERT INTO tablename (a, b, c) values (1, 2, 3);
запрос MySQL:
INSERT INTO tablename (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
становится:
INSERT INTO tablename (a, b, c) values (1, 2, 10)
ON CONFLICT (a) DO UPDATE SET c = tablename.c + 1;
Различия:
ON CONFLICT (columnname) DO
SET
, как если бы это был обычный UPDATE
оператор Он также имеет некоторые интересные функции:
WHERE
на вашем UPDATE
(позволяющее эффективно повернуть ON CONFLICT UPDATE
в ON CONFLICT IGNORE
для определенных значений) EXCLUDED
, которая имеет ту же структуру, что и целевая таблица. Вы можете получить исходные значения в таблице, используя имя таблицы. Поэтому в этом случае EXCLUDED.c
будет 10
(потому что мы пытались вставить), а "table".c
будет 3
, потому что это текущее значение в таблице. Вы можете использовать один или оба в выражениях SET
и WHERE
. Для фона на upsert см. Как выполнить UPSERT (MERGE, INSERT ... ON DUPLICATE UPDATE ) в PostgreSQL?