Условное выражение INSERT INTO в postgres
Я пишу процедуру бронирования для макетной базы данных бронирования авиабилетов, и то, что я действительно хочу сделать, это примерно так:
IF EXISTS (SELECT * FROM LeadCustomer
WHERE FirstName = 'John' AND Surname = 'Smith')
THEN
INSERT INTO LeadCustomer (Firstname, Surname, BillingAddress, email)
VALUES ('John', 'Smith', '6 Brewery close,
Buxton, Norfolk', [email protected]');
Но Postgres не поддерживает инструкции IF
без загрузки расширения PL/pgSQL. Мне было интересно, есть ли способ сделать какой-то эквивалент этого или если на этом этапе должно быть какое-то взаимодействие с пользователем?
Ответы
Ответ 1
Эта конкретная команда может быть выполнена следующим образом:
insert into LeadCustomer (Firstname, Surname, BillingAddress, email)
select
'John', 'Smith',
'6 Brewery close, Buxton, Norfolk', '[email protected]'
where not exists (
select * from leadcustomer where firstname = 'John' and surname = 'Smith'
);
Он будет вставлять результат оператора select, а select
будет возвращать только строку, если этот клиент не существует.
Ответ 2
В версии 9.5 версия pgsql upsert включена, используя INSERT... ON CONFLICT DO UPDATE...
Ниже приведен ответ ниже. Postgres 9.5 был выпущен через пару лет с лучшим решением.
Postgres не имеет функции upsert" без добавления новых функций.
Что вам нужно сделать, так это запустить запрос выбора и посмотреть, есть ли у вас соответствующие строки. Если вы это сделаете, вставьте его.
Я знаю, что вы точно не хотите upsert, но это почти то же самое.