Postgresql 插入/更新与自动增量Postgres冲突
我有一个Postgresql 插入/更新与自动增量Postgres冲突,postgresql,Postgresql,我有一个answers表,其中有answers.id,answers.question\u id,answers.value和answers.report\u id answers.id在定期插入时自动递增 答案。问题id的值介于1和10之间,因为有10个问题,但这些问题不是表格所独有的,并且取决于报告id列 答案。报告id用于引用单独表格中的报告 我想要实现的是,如果特定的报告id没有冲突的问题,则插入一条新记录。如果存在冲突,请使用新的值更新记录 到目前为止,我已经读到了有关UPSERT的文
answers
表,其中有answers.id
,answers.question\u id
,answers.value
和answers.report\u id
answers.id
在定期插入时自动递增
答案。问题id
的值介于1和10之间,因为有10个问题,但这些问题不是表格所独有的,并且取决于报告id
列
答案。报告id
用于引用单独表格中的报告
我想要实现的是,如果特定的报告id
没有冲突的问题
,则插入一条新记录。如果存在冲突,请使用新的值更新记录
到目前为止,我已经读到了有关UPSERT的文章
我尝试了以下查询
INSERT INTO answers (id, value)
VALUES(8, 3)
ON CONFLICT (id) DO UPDATE SET value = EXCLUDED.value
WHERE answers.report_id = 55
查询工作正常,但问题是每次没有冲突时,我都必须为id
分配一个唯一的值,我不知道下一个最好的id
是什么
我的另一个想法是创建第二列,在该列中存储另一个唯一的id用于答案和冲突检查,并将id
保留为自动增量
我的第三个想法是首先为特定的报告运行问题id
的选择问题。如果没有这样的结果,请运行常规插入,否则请更新现有插入
理想情况下,我希望运行单个查询,而不是创建第二个唯一答案id列。我觉得您应该创建一个包含两列的唯一约束:
ALTER TABLE answers ADD UNIQUE (report_id, question_id);
然后,您可以将该约束用于冲突上的:
INSERT INTO answers (question_id, report_id, value)
VALUES (1, 2, 'gewonnen')
ON CONFLICT (report_id, question_id) DO UPDATE
SET value = EXCLUDED.value;
请注意,您不需要WHERE
子句,因为这只与冲突行有关
还请注意,我没有指定id
,因此使用了自动生成的值。Hello Albe,您的解决方案解决了这个问题。谢谢我不知道多列约束。我会仔细阅读的。我早些时候用两个查询解决了这个问题,但这要好得多。我打赌性能也更高。