有条件的INSERT INTO在Postgres的声明(Conditional INSERT INT

2019-08-18 06:19发布

我正在写一个登记过程的模拟航空公司订票数据库和我真正想要做的是这样的:

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', cmp.testing@example.com');

但Postgres的不支持IF语句,而无需加载PL / pgSQL的扩展。 或者我不知道是否有一种方法可以做到这一些等价的,如果只是将不得不在这个步骤中一些用户交互?

Answer 1:

这特定的命令可以做这样的:

insert into LeadCustomer (Firstname, Surname, BillingAddress, email)
select 
    'John', 'Smith', 
    '6 Brewery close, Buxton, Norfolk', 'cmp.testing@example.com'
where not exists (
    select * from leadcustomer where firstname = 'John' and surname = 'Smith'
);

它会插入SELECT语句的结果,和select ,如果客户不存在,只返回一行。



Answer 2:

随着9.5版本的pgsql UPSERT的包括,使用INSERT ... ON冲突DO UPDATE ...

下面的答案已经不再重要。 Postgres的9.5发布了几年后有一个更好的解决方案。

Postgres没有“ UPSERT无需添加新的功能”功能。
什么,你必须做的就是运行SELECT查询,看看你有匹配的行。 如果你这样做,然后将其插入。

我知道你不完全想要的UPSERT,但它几乎是相同的。



文章来源: Conditional INSERT INTO statement in postgres