Подтвердить что ты не робот

Условное выражение 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. Мне было интересно, есть ли способ сделать какой-то эквивалент этого или если на этом этапе должно быть какое-то взаимодействие с пользователем?

4b9b3361

Ответ 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, но это почти то же самое.