Postgres SERIAL在错误INSERT命令后添加值

时间:2016-07-17 11:36:55

标签: sql postgresql

我创建了一个表

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以及如何更改它?

1 个答案:

答案 0 :(得分:2)

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

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

我们希望id为1和3的值,而2只会被省略。还有别的东西,我们有问题。

如果你真的需要无间隙的nubering那么你必须使用一个单独的表和行锁,但是你不能有并发客户端插入....