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:
216
7.1. Вставка строк в таблицы
INSERT INTO aircrafts_tmp
VALUES ( 'SU9', 'Sukhoi SuperJet', 3000 )
Достарыңызбен бөлісу: |