关于数据库:postgres中的条件INSERT INTO语句

Conditional INSERT INTO statement in postgres

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

1
2
3
4
5
6
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扩展。 我想知道是否有办法做一些相当于这个或者如果在这一步中只需要进行一些用户交互?


那个特定的命令可以像这样完成:

1
2
3
4
5
6
7
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将仅返回一行。


As of 9.5 version of pgsql upsert is included, using INSERT ... ON CONFLICT DO UPDATE ...

以下答案已不再适用。 Postgres 9.5在几年后发布,提供了更好的解决方案。

Postgres没有添加新功能就没有"upsert"功能。
您需要做的是运行select查询并查看是否有匹配的行。 如果你这样做,那么插入它。

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