Правильный способ избежать вставки дубликатов - определить поля как UNIQUE
(или PRIMARY KEY
)
CREATE TABLE Test (
aaa integer,
bbb integer,
val text, /* The reason why I added this field is explained later */
UNIQUE (aaa,bbb)
)
Вставка завершится неудачно с кодом ошибки, если кортеж уже существует (получение кодов ошибок)из базы данных - это хорошо, как я недавно объяснил здесь ).
Если для вас неприемлемо иметь ошибки или если вы хотите вставить несколько записей в одну insert
не заботясь о том, какой из них нарушает ограничение UNIQUE
, правильный синтаксис заключается в использовании предложения ON CONFLICT
.
INSERT INTO Test values (1,1,'Some value')
ON CONFLICT DO NOTHING
В основном будет вставлена первая запись с уникальным кортежем.Это совместимо, даже если сам запрос пытается вставить дубликаты, как в случае ниже:
INSERT INTO Test values (2,2,'Will be inserted'), (2,2,'Will not be inserted')
ON CONFLICT DO NOTHING
Конечно, это также позволит вам иметь предложение RETURNING
в том же запросе.