将'serial'添加到Postgres中的现有列
我在我的Postgres 9.0数据库中有一个小表(〜30行),带有一个整数ID字段(主键),它当前包含从1开始的唯一顺序整数,但不是使用'serial'关键字创build的。
我怎么能改变这个表,以便从现在插入到这个表将导致这个领域的行为就像它已经被创build与'串行'作为一种types?
看下面的命令(特别是注释块)。
DROP TABLE foo; DROP TABLE bar; CREATE TABLE foo (a int, b text); CREATE TABLE bar (a serial, b text); INSERT INTO foo (a, b) SELECT i, 'foo ' || i::text FROM generate_series(1, 5) i; INSERT INTO bar (b) SELECT 'bar ' || i::text FROM generate_series(1, 5) i; -- blocks of commands to turn foo into bar CREATE SEQUENCE foo_a_seq; ALTER TABLE foo ALTER COLUMN a SET DEFAULT nextval('foo_a_seq'); ALTER TABLE foo ALTER COLUMN a SET NOT NULL; ALTER SEQUENCE foo_a_seq OWNED BY foo.a; -- 8.2 or later SELECT MAX(a) FROM foo; SELECT setval('foo_a_seq', 5); -- replace 5 by SELECT MAX result INSERT INTO foo (b) VALUES('teste'); INSERT INTO bar (b) VALUES('teste'); SELECT * FROM foo; SELECT * FROM bar;
你也可以使用START WITH
从一个特定的点开始一个序列,尽pipesetval完成了同样的事情,就像在欧拉的回答中一样,
SELECT MAX(a) + 1 FROM foo; CREATE SEQUENCE foo_a_seq START WITH 12345; -- replace 12345 with max above ALTER TABLE foo ALTER COLUMN a SET DEFAULT nextval('foo_a_seq');
此页面上的答案已过时 。 为了将来的参考,请看这个答案