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

如何插入。。。在冲突(id)上进行更新。。。语法是否可以与序列ID一起使用?

戴鸿羽
2023-03-14

在postgresql 9.5中,如何插入。。。在冲突(id)上进行更新。。。语法是否可以与序列ID一起使用?

在具有以下列的表tbltest中:

  • tbltest_ID

其中,tbltest_ID在数据库中有一个自动递增的序列。

以下内容适用于更新,例如:;正在更新ID为4的记录:

INSERT INTO tbltest (
    tbltest_ID,
    tbltest_Name,
    tbltest_Description) 
VALUES 
(4, 'test name','test description')
ON CONFLICT (tbltest_ID) DO UPDATE SET (
    tbltest_Name,
    tbltest_Description) = (
    excluded.tbltest_Name,
    excluded.tbltest_Description) RETURNING *;

但是为了让DB为插入创建序列ID,我需要从语句中删除ID列:

INSERT INTO tbltest (
    tbltest_Name,
    tbltest_Description) 
VALUES 
('test name','test description')
ON CONFLICT (tbltest_ID) DO UPDATE SET (
    tbltest_Name,
    tbltest_Description) = (
    excluded.tbltest_Name,
    excluded.tbltest_Description) RETURNING *;

如果我想更新多个记录(一些新记录和一些现有记录),这就成了一个问题。就好像我删除了ID列,它们都是插入,如果我把它留在那里,我必须在每一行的值数组中提供一个ID值,当我定义一个ID时,序列(db的自动增量)就不再使用了。

插页怎么样。。。在冲突(id)上进行更新。。。语法spost与序列ID一起使用,以插入/更新将包含新记录和现有记录的一组记录?

例如,以下情况不起作用:

INSERT INTO tbltest (
    tbltest_ID,
    tbltest_Name,
    tbltest_Description) 
VALUES 
(NULL, 'new record','new record description'),
(4, 'existing record name','existing record description')
ON CONFLICT (tbltest_ID) DO UPDATE SET (
    tbltest_Name,
    tbltest_Description) = (
    excluded.tbltest_Name,
    excluded.tbltest_Description) RETURNING *;

它抛出了一个错误:

错误:“tbltest_ID”列中的null值违反了not null约束

谢谢你抽出时间。

共有1个答案

程鸿畅
2023-03-14

好吧,刚刚解决了。我读了尼尔·康威的一篇很棒的文章:http://www.neilconway.org/docs/sequences/

其中,他显示了使用DEFAULT关键字来告诉DB使用列的序列值。

下面是一个更新后的例子:

INSERT INTO tbltest (
    tbltest_ID,
    tbltest_Name,
    tbltest_Description) 
VALUES 
(DEFAULT, 'new record','new record description'),
(4, 'existing record name','existing record description')
ON CONFLICT (tbltest_ID) DO UPDATE SET (
    tbltest_Name,
    tbltest_Description) = (
    excluded.tbltest_Name,
    excluded.tbltest_Description) RETURNING *;

希望这能帮助别人;-)

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

  • 我有两个目标 使用以下映射文件 当我保存一个包含一个子项的父项时,生成的sql如下所示 Hibernate:插入到父(id,名称)值中(null,?) Hibernate:插入子(id、父id、名称)值(null、、?) Hibernate:更新子集父\u id=?其中id=? 似乎当hibernate插入孩子时,它会将parent_id设置为空,然后进行更新。这在我的数据库和Hibernate验

  • 对于时区API-https://docs.oracle.com/javase/7/docs/API/java/util/TimeZone.html#getTimeZone(java.lang.string),在哪里可以找到可以用作参数的ID列表?

  • 问题内容: 我认为这是对的,但我在网上找不到任何可确认的信息。我可以使用last_insert_id()获取为autoincrement字段生成的第一个ID,但是我可以假定下一条记录将具有顺序ID吗?还是其他用户可以获取一个ID,以使生成的ID不连续? 示例:将值(1,2),(3,4),(5,6),…,(10000,10001)插入mytable(asdf,qwer); 如果mytable有一个a

  • 问题内容: 当我发现此模式以获取上次插入的行的ID时,我正在查看Drupal模块: 其中的id是按通常的自动递增方式工作的字段。 这在概念上是正确的吗?在MySQL / PostgreSQL环境中这种模式是否会失败? 编辑: 感谢您的出色评论和回答! 我应该澄清一下我的问题:我的意思是, 无论会话如何 ,有人都希望找出最后插入的行的ID 。 问题答案: 这似乎是主观的,但我会说不,这在概念上是不正

  • 问题内容: 从目前的情况来看,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我正在使用jquery datables / jedtiable,它传递回ROW和COLUMN号以及要更新的新值,如下所示。这是POST到另一个JSP页