Postgres INSERT ON CONFLICT DO NOTHING vs SELECT + INSERT查询

时间:2018-02-22 09:11:39

标签: postgresql sql-insert upsert

我的表格stock_price_code如下所示。 value列有一个UNIQUE约束。

create table stock_price_code (
    id serial primary key,
    value text not null,
    unique (value)
);

如果找不到INSERT的记录,我想value进入表格。我有这两个问题:

-- query 1
INSERT INTO stock_price_code (value)
    SELECT 'MCD'
    WHERE NOT EXISTS (SELECT * FROM stock_price_code WHERE value = 'MCD')
    RETURNING id;


-- query 2
INSERT INTO stock_price_code (value) VALUES ('MCD')
    ON CONFLICT (value) DO NOTHING
    RETURNING id;

我在Postgres 9.5之前使用query 1。然后Postgres 9.5开始介绍INSERT ... ON CONFLICT ...功能。如果我用query 1代替query 2,是否有任何已知的副作用或性能问题?感谢。

1 个答案:

答案 0 :(得分:2)

如果在SELECT 'MCD' WHERE NOT EXISTS (SELECT * FROM stock_price_code WHERE value = 'MCD')INSERT INTO stock_price_code (value)之间插入行,

查询2 将有效,而查询1 将失败且重复。

我认为ON CONFLICT的开销小于WHERE NOT EXISTS,但不确定