我的Postgres插入或更新查询出了什么问题

时间:2018-07-05 06:28:45

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

我想向表中插入或更新数据。 “组”列是唯一的,组的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
);

1 个答案:

答案 0 :(得分:0)

看看这个fiddle

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

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