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

标签 sql postgresql insert-update postgresql-9.5 sqlfiddle

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

有一个 fiddle : http://sqlfiddle.com/#!17/551ea/3

  • 在 Insert 上,一切正常

  • 更新也适用于 "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
);

最佳答案

看看这个fiddle

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

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

关于sql - 我的 Postgres 插入或更新查询出了什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51184624/

相关文章:

mysql - 根据日期计算/分组行,包括缺失

php - 列出 PostgreSQL 中的匹配记录

php - PDO - SQLSTATE[42000] 错误

sql - 关于 LINQ 最高性能方法的思考

mysql - 如果第 3 个表没有该值,则连接 3 个表

sql - 按子集 SQL 对记录进行分组

postgresql - 将返回的 SETOF 转换为 PL/PgSQL 中的数组(特别是)

postgresql - 在 PostgreSQL+PostGIS 上插入数百万行、转换数据和处理它的有效方法

python - MariaDB 在 Debian Stretch 中对重复键执行许多操作

Mysql在非空字段上插入或更新为空值时不会出错