代码之家  ›  专栏  ›  技术社区  ›  xRobot

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

  •  140
  • xRobot  · 技术社区  · 15 年前

    我有一个包含现有数据的表。是否有一种方法可以添加主键而不删除并重新创建表?

    4 回复  |  直到 6 年前
        1
  •  269
  •   leonbloy    8 年前

    ( 更新-感谢评论的人 )

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

        2
  •  44
  •   Synesso    10 年前
    ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
    

    这就是你所需要的:

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

    @resnyanskiy在评论中给出了这个答案,因此得到了赞扬。

        3
  •  2
  •   jhoanna Primal Pappachan    7 年前

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

    有关默认生成和始终生成之间的差异,请参见 https://www.cybertec-postgresql.com/en/sequences-gains-and-pitfalls/ .

    有关更改序列的信息,请参见 https://popsql.io/learn-sql/postgresql/how-to-alter-sequence-in-postgresql/ .

        4
  •  1
  •   Dean Sha    7 年前

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

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