【问题标题】:Postgres SERIAL add value after error INSERT commandPostgres SERIAL 在错误 INSERT 命令后添加值
【发布时间】:2016-07-17 11:36:55
【问题描述】:

我创建了一个表

CREATE TABLE street (
    id SERIAL PRIMARY KEY NOT NULL,
  street_name CHAR (30) NOT NULL,
  city_id INTEGER REFERENCES city,
  building_number CHAR(10));

之后我插入一些数据:

INSERT INTO street (street_name, city_id) VALUES ('Sumskaya', 1);

数据以 id=1 添加。然后我插入下一个数据

INSERT INTO street (street_name, city_id) VALUES ('Sumskaya', 10);

并得到错误

表“city”中不存在键 (city_id)=(10)。

我更改了插入数据

INSERT INTO street (street_name, city_id) VALUES ('Sumskaya', 2);

并在表中获取 id = 3 的行。缺少 id = 2。为什么串行分配值 3 而不是 2 以及如何更改它?

【问题讨论】:

标签: sql postgresql


【解决方案1】:

连续剧在内部使用序列。出于并发原因,序列不会回滚。他们只是向前走。想象一下,如果您有两个客户端同时插入。

  • 客户端 1 插入一行,继续做一些其他工作。
  • 客户端 2 插入一行,继续做一些其他工作
  • 客户端 1 提交。
  • 客户端 1 插入另一行,继续做一些其他工作
  • 客户端 2 出错并回滚。

我们期望 id 为 1 和 3 的值,而 2 只是被省略了。如果是其他的,我们就会遇到问题。

如果您确实需要无缝核对,那么您必须使用单独的表锁和行锁,但是您不能让并发客户端插入....

【讨论】:

    猜你喜欢
    • 2013-01-27
    • 2023-03-07
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多