PostgreSQL INSERT发生冲突时,仅当任何值不同时才重新插入

vkc1a9a2  于 2023-04-05  发布在  PostgreSQL
关注(0)|答案(1)|浏览(160)

我知道如何使用PostgreSQL的INSERT ON CONFLICT来更新或不做任何事情。然而,我想实现这样的行为,如果行中指定的数据值相同,则不做任何事情,但如果存在差异,则插入新行,而不是更新现有行。
例如,假设您有一个名为test的表:

create table test (id text, data text, created_on date);
INSERT INTO public.test (id, data, created_on)
  VALUES (1, 'foo', '2023-03-27'::date);

然后,假设我们尝试插入另一行:

(1, 'foo', '2023-03-28'::date)

在这种情况下,因为iddata相同,所以忽略它。
但是,假设我们尝试插入另一行

(1, 'bar', '2023-03-28'::date)

现在,data的值已经改变了,但是我不想更新原始行,而是想插入一个新行,所以:

select * from test

应屈服

id | data | created_on
----+------------------
 1  | foo  | 2023-03-27
 2  | foo  | 2023-03-28
yyyllmsg

yyyllmsg1#

您需要对要检查冲突的列使用UNIQUE约束。

CREATE TABLE test (
  id text,
  data text,
  created_on date,
  UNIQUE(id, data)
);

然后在ON CONFLICT子句中命名这些列:

INSERT INTO public.test (id, data, created_on)
VALUES (1, 'foo', '2023-03-27'::date)
ON CONFLICT (id, data)
DO NOTHING;

相关问题