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,您的解决方案解决了这个问题。谢谢我不知道多列约束。我会仔细阅读的。我早些时候用两个查询解决了这个问题,但这要好得多。我打赌性能也更高。