当前位置: 首页 > 知识库问答 >
问题:

使用自动增量Postgres插入/更新冲突

訾俊名
2023-03-14

我有一个答案表,它有answers.idanswers.question_idanswers.valueanswers.report_id

answers.id在常规插入时自动递增。

answers.question_id的值介于1到10之间,因为有10个问题,但对表来说不是唯一的,并且依赖于report_id列。

answers.report_id用于引用单独表中的报表。

我要实现的是,如果对于特定的report_id没有冲突的questions_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列。


共有1个答案

贾飞鸿
2023-03-14

在我看来,您应该用两列创建一个唯一的约束:

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,所以使用了自动生成的值。

 类似资料:
  • 我有一张像下面这样的桌子。我试图根据CTE中的值合并到此表中。但当我试图在出现冲突时更新表时,它无法获得CTE中的值 现在使用cte,我想在这个表中插入/更新记录。下面是我用来做同样的事情的代码。当记录已经存在于表中时,我想根据cte(cte_input_data.data_type_id)中的data_type_id值更新表,但它失败并出错。 它应该实现的是 > 如果cte_输入_数据。数据类型

  • 我正在写一个数据挖掘程序,可以批量插入用户数据。 当前SQL只是一个普通的批量插入: 如果发生冲突,如何进行更新?我试过: 但它抛出

  • 我试图在表中插入一行,带有一个自动递增字段,但我遇到了错误。该表的结构为: id:自动增量 级别:文本 概念:文本 . 在w3c中,我了解到要将新记录插入表中,我们不必为“自动增量”列指定值(将自动添加唯一值)。 我做错了什么?

  • 我正在使用java中的MySQL库执行一个查询。在我的数据库结构中,有一列名为(主键,非空且自动递增)。通常在每次插入查询中,我都将值设置为,在查询执行后,它会增加最后一个id,但在java中这样做会给我异常。 这就是代码: 如何使用自动增量ID执行查询?

  • 您好,我尝试使用mysqli从第一个表中获取autoincrement id,然后插入到第二个表中,这是我为每个表设计的数据库 表用户 表siswa 这就是我尝试过的 数据插入到用户表中,但不插入到siswa表中,对此有何建议? 编辑:被忽略的变量只($jkortu)现在修复,谢谢

  • 问题内容: 我正在寻找这样的查询: id | int | 自动增量 varchar | 255 这样桌子就看起来像 1 | val1 2 | val2 3 | val3 … 除了id总是以每一行都结束而已。 我怎样才能做到这一点? 问题答案: