我有一个包含现有数据的表格。是否有一种方法可以在不删除和重新创建表格的情况下添加主键?
我有一个包含现有数据的表格。是否有一种方法可以在不删除和重新创建表格的情况下添加主键?
(更新 - 感谢发表评论的人)
假设您有一个名为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 test1 ALTER COLUMN id SET DEFAULT nextval('test_id_seq');
UPDATE test1 SET id = nextval('test_id_seq');
再次强调,对于最近版本的Postgres来说,这与上面的单个命令大致等效。
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
以下是您需要进行的全部操作:
id
列。@resnyanskiy 在评论中给出了此答案。
ALTER TABLE <table> DROP CONSTRAINT <pkey_name>;
- Josh Robertson在v10中使用自增列,
ALTER TABLE test
ADD COLUMN id { int | bigint | smallint}
GENERATED { BY DEFAULT | ALWAYS } AS IDENTITY PRIMARY KEY;
关于identity列的解释,请参见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
。 - isapir我来到这里是因为我也在寻找类似的内容。在我的情况下,我需要将多个列的数据从一组分段表复制到一个表中,并给目标表分配行ID。这是我使用的一种上述方法的变体。我在目标表的末尾添加了序列列。这样我就不必在插入语句中为它设置占位符了。然后,简单的“select * into”语句就可以自动填充目标表的这一列。以下是我在PostgreSQL 9.6.4上使用的两个SQL语句。
ALTER TABLE target ADD COLUMN some_column SERIAL;
INSERT INTO target SELECT * from source;
ALTER TABLE test1 ADD id int8 NOT NULL GENERATED ALWAYS AS IDENTITY;
将test1表添加id int8列,非空并且作为标识列自动生成。
ALTER TABLE dbo."Users"
ALTER COLUMN "UserID"
ADD GENERATED BY DEFAULT AS IDENTITY (MINVALUE 1 START WITH 1 INCREMENT BY 1)
SELECT setval('"Users_UserID_seq"', (SELECT max("UserID")+1 FROM dbo."Users"), false)
其中"Users"是一个表,"UserID"是主键。
id
为bigint
? - p.matsinopoulos