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

Postgres INSERT ON CONFLICT DO NOTHING vs SELECT + INSERT query

我有 table stock_price_code 如下。 value 列有 UNIQUE 约束。

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

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

-- 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 2 替换 query 1,是否有任何已知的副作用或性能问题?谢谢。

如果在 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 小,但不确定