65

我正在为模拟航空公司预订数据库编写预订程序,我真正想做的是这样的:

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 扩展的语句。我想知道是否有办法做到这一点,或者在这一步中是否需要进行一些用户交互?

4

2 回答 2

119

该特定命令可以这样完成:

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

它将插入 select 语句的结果,并且select仅在该客户不存在时才返回一行。

于 2013-03-29T20:01:22.493 回答
8

从 9.5 版本开始,包含 pgsql upsert,使用INSERT ... ON CONFLICT DO UPDATE ...

下面的答案不再相关。几年后发布了 Postgres 9.5,并提供了更好的解决方案。

Postgres 在不添加新功能的情况下没有“ upsert ”功能。
您需要做的是运行选择查询并查看是否有匹配的行。如果你这样做,然后插入它。

我知道你并不想要一个 upsert,但它几乎是一样的。

于 2013-03-29T19:38:40.560 回答