Как исправить ошибку в приложении сканирования штрих-кода, вылетает при выполнении сетевого запроса

В 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?

0
задан justamarkprime 26 March 2019 в 08:11
поделиться