You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在PostgreSQL中为无唯一数据的现有表添加主键列?

嘿,这事儿好办!给你两种在PostgreSQL里给已有数据的表加主键列的常用方法,适配不同版本和场景:

方法1:用SERIAL(兼容旧版本PostgreSQL)

这是PostgreSQL里传统的自增列实现方式,兼容9.x及以上所有版本,操作起来很简单:

  1. 先添加一个SERIAL类型的列,PostgreSQL会自动创建对应的序列,并且给现有所有行自动填充唯一的递增数值
  2. 再把这个列设为主键

执行的SQL代码如下:

-- 替换成你的表名
ALTER TABLE your_table_name ADD COLUMN id SERIAL;

-- 将新增的id列设为主键
ALTER TABLE your_table_name ADD PRIMARY KEY (id);

小提示SERIAL其实是INTEGER类型加序列的语法糖,后续新增的行会自动从序列获取下一个值,保证唯一性。

方法2:用IDENTITY列(PostgreSQL 10+推荐,符合SQL标准)

如果你用的是PostgreSQL 10或更高版本,更推荐用这种符合SQL标准的方式,比SERIAL更严谨:

  1. 添加一个GENERATED ALWAYS AS IDENTITY的整数列,同样会自动给现有行填充唯一值
  2. 再设置为主键

SQL代码示例:

-- 替换成你的表名
ALTER TABLE your_table_name ADD COLUMN id INTEGER GENERATED ALWAYS AS IDENTITY;

-- 设置为主键
ALTER TABLE your_table_name ADD PRIMARY KEY (id);

如果之后你需要手动给id列插入自定义值(而不是完全依赖自动生成),可以把ALWAYS改成BY DEFAULT

ALTER TABLE your_table_name ADD COLUMN id INTEGER GENERATED BY DEFAULT AS IDENTITY;
针对大表的优化方案(生产环境必备)

如果你的表数据量很大(比如百万级以上),直接执行ADD PRIMARY KEY会锁表很长时间,影响业务。这时候可以分步操作,用CONCURRENTLY创建唯一索引,再把索引关联为主键,这样不会锁表(但耗时会更长):

-- 先创建唯一索引,CONCURRENTLY选项不会阻塞表的读写
CREATE UNIQUE INDEX CONCURRENTLY idx_your_table_id ON your_table_name (id);

-- 再将这个索引设为主键
ALTER TABLE your_table_name ADD CONSTRAINT pk_your_table_id PRIMARY KEY USING INDEX idx_your_table_id;

内容的提问来源于stack exchange,提问作者JoeJam

火山引擎 最新活动