Answers:
(已更新-感谢发表评论的人)
假设您有一个名为的表test1
,您想要向其中添加一个自动递增的主键id
(代理)列。在最新版本的PostgreSQL中,以下命令应该足够了:
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
在旧版本的PostgreSQL(8.x之前的版本?)中,您必须完成所有肮脏的工作。以下命令序列可以解决问题:
ALTER TABLE test1 ADD COLUMN id INTEGER;
CREATE SEQUENCE test_id_seq OWNED BY test1.id;
ALTER TABLE test ALTER COLUMN id SET DEFAULT nextval('test_id_seq');
UPDATE test1 SET id = nextval('test_id_seq');
同样,在最新版本的Postgres中,这大致等同于上面的单个命令。
ADD PRIMARY KEY
还会NOT NULL
按照预期和需要创建约束(在postgres 9.3中进行了测试)。
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
要在v10中使用标识列,
ALTER TABLE test
ADD COLUMN id { int | bigint | smallint}
GENERATED { BY DEFAULT | ALWAYS } AS IDENTITY PRIMARY KEY;
有关标识列的说明,请参见https://blog.2ndquadrant.com/postgresql-10-identity-columns/。
有关GENERATED BY DEFAULT和GENERATED ALWAYS之间的区别,请参见https://www.cybertec-postgresql.com/en/sequences-gains-and-pitfalls/。
有关更改顺序的信息,请参见https://popsql.io/learn-sql/postgresql/how-to-alter-sequence-in-postgresql/。
SQL Error [23502]: ERROR: column "id" contains null values