我有一个表,其中有像id, name, start_date, end_date这样的列,以及2个唯一约束unique(id, name, start_date)和unique(id, name, end_date)
现在,当我为这个表编写insert查询时,我的代码如下
insert into table (id, name, start_date, end_date)
values (1, 'test', 'example-start-date', 'example-end-date')
on conflict (id, name, start_date) set something
on conflict (id, name, end_date) set something但是得到错误,这是不允许的吗?
谢谢
发布于 2021-10-05 16:23:37
答案取决于something。
对于
DO NOTHING,答案是简单地使用单个子句,而不指定列:在冲突中什么都不做
可以处理多个唯一约束上的冲突。
对于
DO UPDATE,没有直接的解决方案。The syntax diagram in the documentation表明,您只能使用一个ON CONFLICT子句来确定一个唯一索引。您可以使用过程代码以传统的方式完成此操作,例如在PL/pgSQL中:
声明v_constraint文本;BEGIN loop --无限循环,直到INSERT或UPDATE成功,BEGIN INSERT INTO ...;EXIT;-- leave LOOP if INSERT succeeds WHEN unique_violation THEN GET STACKED DIAGNOSTICS v_constraint := CONSTRAINT_NAME;END;CASE v_constraint WHEN 'constraint_name_1‘THEN UPDATE ...;WHEN 'constraint_name_2‘THEN UPDATE ...;END CASE;找到时退出;--如果UPDATE更改了行,则离开循环END LOOP;END;
https://stackoverflow.com/questions/69453553
复制相似问题