【问题标题】:Whats wrong on my Postgres insert or update query我的 Postgres 插入或更新查询出了什么问题
【发布时间】:2018-12-13 12:59:50
【问题描述】:

我想向表中插入或更新数据。 “组”列是唯一的,组的 ID 应保持不变。

有一个小提琴: http://sqlfiddle.com/#!17/551ea/3

  • 在插入时,一切正常

  • 更新也适用于“Group”='TEST01'

但是当我插入一个新组然后更新时,ID会改变(按多个“运行SQL”)

这是我的插入查询:

INSERT INTO GROUPS ("GROUP", SERVER, PATH, SHARE)
VALUES ('TEST04', 4, 4, 4)
ON CONFLICT("GROUP") DO UPDATE
SET SERVER = 11,
    PATH = 11, 
    SHARE = 11
WHERE GROUPS."GROUP" = 'TEST01'

ID 将在其他表中使用,这应该只为第一个条目创建一次。

这是一般结构:

CREATE SEQUENCE gid START 1;
CREATE TABLE GROUPS (
  ID integer NOT NULL DEFAULT nextval('gid') PRIMARY KEY,
  "GROUP" VARCHAR NOT NULL UNIQUE,
  SERVER integer,
  PATH integer,
  SHARE integer
);

【问题讨论】:

  • 我认为这是 SQLFiddle 的问题,不是你的 SQL 的问题。使用“普通”SQL 客户端针对未在 Internet 上共享的数据库运行您的脚本。代码很好,可以正常工作。

标签: sql postgresql insert-update postgresql-9.5 sqlfiddle


【解决方案1】:

看看这个fiddle

每次插入冲突时 - 序列值被丢弃,ON UPDATE 请求一个新值。因此,最初您从 1 开始,然后插入 3 个元组,因此序列的最终值为 3。然后您尝试插入一个新元组但存在冲突 - 所以序列的值现在为 4。然后您尝试插入一个新元组 - 它的序列值为 5。

如果您继续运行 2 次插入,序列将继续增加。 SQLfiddle 可能使用持久连接或某些连接池,在重建模式时无法正确重置序列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-29
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多