INSERT INTO aircrafts_tmp
VALUES ( 'S99', 'Sukhoi SuperJet-100', 3000 )
ON CONFLICT ( aircraft_code ) DO NOTHING
RETURNING *;
Поскольку конфликта по столбцу aircraft_code нет, то далее проверяется выполнение
требования уникальности по столбцу model. В результате мы получим традиционное
сообщение об ошибке, относящееся к столбцу model:
ОШИБКА: повторяющееся значение ключа нарушает ограничение уникальности
"aircrafts_tmp_model_key"
,
→
ПОДРОБНОСТИ: Ключ "(model)=(Sukhoi SuperJet-100)" уже существует.
Теперь рассмотрим второй вариант обработки предложения ON CONFLICT, когда опе-
рация вставки новой строки заменяется операцией обновления существующей стро-
ки, с которой и возник конфликт значений столбцов. Для реализации этой возмож-
ности служит предложение DO UPDATE.
Давайте модифицируем команду и добавим предложение DO UPDATE. Выберем та-
кую политику для работы с таблицей aircrafts_tmp: если при вставке новой строки
имеет место дублирование по атрибутам первичного ключа со строкой, находящей-
ся в таблице, тогда мы будем обновлять значения всех остальных атрибутов в этой
строке, независимо от того, совпадают ли они со значениями в новой строке или нет.
В качестве примера сделаем так: в добавляемой строке значение атрибута model сде-
лаем отличающимся от того, которое уже есть в таблице (вместо «Sukhoi SuperJet-100»
будет «Sukhoi SuperJet»), а значение атрибута range оставим без изменений (3000).
Внесем в команду еще одно изменение, а именно: вместо имени столбца, образую-
щего первичный ключ, с помощью предложения ON CONSTRAINT укажем наимено-
вание ограничения первичного ключа.
Вот так выглядит команда с предложением DO UPDATE:
INSERT INTO aircrafts_tmp
VALUES ( 'SU9', 'Sukhoi SuperJet', 3000 )
ON CONFLICT ON CONSTRAINT aircrafts_tmp_pkey
DO UPDATE SET model = excluded.model,
Достарыңызбен бөлісу: |