手动更新主键

manually updating primary key

我们正在处理不会自动递增主键的遗留代码(请参阅 serial),因此我必须手动执行此操作。在插入时手动更新主键字段的正确方法是什么。当我执行以下操作时出现错误

Table:

CREATE TABLE pizza (
    id bigint not null,
    price int
)

插入语句:

INSERT INTO pizza
    (id, price)
VALUES
    (
    (SELECT max(id) from pizza)+1,
    1.75
    )

不要使用 max()+1 生成主键。它对并发插入不安全,而且扩展性也不好。

只需创建一个序列并使用它:

create sequence pizza_id_seq;

然后将其与table中的当前值同步:

select setval('pizza_id_seq', coalesce(max(id),1))
from pizza;

然后,不要将 INSERT 语句更改为使用可怕的 max() + 1,只需使用序列:

INSERT INTO pizza
  (id, price)
VALUES
  (nextval('pizza_id_seq'), 1.75)