如何在PostgreSQL中向现有表添加自动递增主键?

xRo*_*bot 177 postgresql primary-key auto-increment

我有一张包含现有数据的表格.有没有办法添加主键而不删除并重新创建表?

leo*_*loy 325

(更新 - 感谢评论的人)

PostgreSQL的现代版本

假设您有一个名为的表test1,要向其添加自动递增的主键id(代理)列.在PostgreSQL的最新版本中,以下命令应该足够了:

   ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
Run Code Online (Sandbox Code Playgroud)

PostgreSQL的旧版本

在旧版本的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的最新版本中,这大致相当于上面的单个命令.

  • UPDATE test1 SET id = DEFAULT; 也有效. (29认同)
  • 在Postgres中你可以使用单个命令`ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;` (16认同)
  • 使用“ALTER TABLE <table> ADD COLUMN id SERIAL PRIMARY KEY”时,如何指定“id”为“bigint”? (5认同)
  • @p.matsinopoulos 只需替换 SERIAL -> BIGSERIAL (5认同)
  • 我正在使用ORACLE,所以分享它可能对ORACLE的ORACLE有用:ALTER TABLE TEST1 ADD ID NUMBER; UPDATE TEST1 SET ID = TEST1_SEQ.NEXTVAL; ALTER TABLE TEST1添加主键(ID); 在执行UPDATE语句之前创建Sequence TEST1_SEQ (3认同)

Syn*_*sso 53

ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
Run Code Online (Sandbox Code Playgroud)

这就是您所需要的:

  1. 添加id
  2. 使用从1到count(*)的序列填充它.
  3. 将其设置为主键/非空.

感谢@resnyanskiy在评论中给出了这个答案.

  • 这应该标记为答案,答案应该属于@resnyanskiy (2认同)
  • 我必须先删除 pkey,然后运行它。`ALTER TABLE <表> DROP CONSTRAINT <pkey_name>;` (2认同)

Dea*_*Sha 7

我来到这里是因为我也在寻找类似的东西。就我而言,我将数据从一组具有许多列的临时表复制到一个表中,同时还将行 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)


jho*_*nna 7

要在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/

  • @isapir:在早期版本(第10和10.1版)中有一个错误会产生此错误。它已在第10.2页中修复。此处的详细信息:https://dba.stackexchange.com/q/200143/3684 (3认同)