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

时间:2010-05-31 15:31:58

标签: postgresql primary-key auto-increment

我有一张包含现有数据的表格。有没有办法在不删除和重新创建表的情况下添加主键?

4 个答案:

答案 0 :(得分:289)

更新 - 感谢评论的人)

PostgreSQL的现代版本

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

   ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;

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');

同样,在Postgres的最新版本中,这大致相当于上面的单个命令。

答案 1 :(得分:47)

call listpicker.open

这就是您所需要的:

  1. 添加ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
  2. 使用从1到count(*)的序列填充它。
  3. 将其设为主键/非空。
  4. @resnyanskiy给予了评价,他在评论中给出了这个答案。

答案 2 :(得分:3)

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

答案 3 :(得分:1)

我降落在这里因为我也在寻找类似的东西。在我的例子中,我将数据从一组具有许多列的临时表复制到一个表中,同时还将行ID分配给目标表。以下是我使用的上述方法的变体。 我在目标表的末尾添加了串行列。这样我就不必在Insert语句中为它添加占位符。然后一个简单的select *进入目标表自动填充此列。以下是我在PostgreSQL 9.6.4上使用的两个SQL语句。

ALTER TABLE target ADD COLUMN some_column SERIAL;
INSERT INTO target SELECT * from source;