我的表格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
,是否有任何已知的副作用或性能问题?感谢。
答案 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
,但不确定