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
小,但不确定
我有 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
小,但不确定