xRo*_*bot 177 postgresql primary-key auto-increment
我有一张包含现有数据的表格.有没有办法添加主键而不删除并重新创建表?
leo*_*loy 325
(更新 - 感谢评论的人)
假设您有一个名为的表test1,要向其添加自动递增的主键id(代理)列.在PostgreSQL的最新版本中,以下命令应该足够了:
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
Run Code Online (Sandbox Code Playgroud)
在旧版本的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');
Run Code Online (Sandbox Code Playgroud)
同样,在Postgres的最新版本中,这大致相当于上面的单个命令.
Syn*_*sso 53
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
Run Code Online (Sandbox Code Playgroud)
这就是您所需要的:
id列感谢@resnyanskiy在评论中给出了这个答案.
我来到这里是因为我也在寻找类似的东西。就我而言,我将数据从一组具有许多列的临时表复制到一个表中,同时还将行 ID 分配给目标表。这是我使用的上述方法的变体。我在目标表的末尾添加了序列列。这样我就不必在 Insert 语句中为其添加占位符。然后简单的 select * into 目标表自动填充此列。这是我在 PostgreSQL 9.6.4 上使用的两条 SQL 语句。
ALTER TABLE target ADD COLUMN some_column SERIAL;
INSERT INTO target SELECT * from source;
Run Code Online (Sandbox Code Playgroud)
要在v10中使用标识列,
ALTER TABLE test
ADD COLUMN id { int | bigint | smallint}
GENERATED { BY DEFAULT | ALWAYS } AS IDENTITY PRIMARY KEY;
Run Code Online (Sandbox Code Playgroud)
有关标识列的说明,请参见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/。
| 归档时间: |
|
| 查看次数: |
129555 次 |
| 最近记录: |