PostgreSQL为现有表添加序列列 解决重复行无唯一标识问题
操作方案
1. 新增id列并自动填充连续整数作为主键
不同数据库的实现语法略有区别,对应写法如下:
- MySQL:
执行语句后会自动为所有现有行按顺序生成从1开始的连续整数,自动设置为主键:
ALTER TABLE 你的表名 ADD COLUMN id INT PRIMARY KEY AUTO_INCREMENT FIRST;
- PostgreSQL:
ALTER TABLE 你的表名 ADD COLUMN id SERIAL PRIMARY KEY;
- SQL Server:
ALTER TABLE 你的表名 ADD id INT IDENTITY(1,1) PRIMARY KEY;
2. 清理现有重复数据(强烈建议执行)
新增id后你已经可以唯一标识每一行数据,接下来可以按照业务规则清理重复的fips+customer_id组合:
首先查询所有重复的组合,确认重复量级:
SELECT fips, customer_id, COUNT(*) AS 重复行数 FROM 你的表名 GROUP BY fips, customer_id HAVING COUNT(*) > 1;
如果确认保留每组重复数据中id最小的行,删除其余重复行,可以执行以下语句(以MySQL为例,其他数据库语法类似):
DELETE t1 FROM 你的表名 t1 INNER JOIN 你的表名 t2 ON t1.fips = t2.fips AND t1.customer_id = t2.customer_id AND t1.id > t2.id;
3. 新增联合唯一约束避免后续再产生脏数据
清理完重复数据后,从表结构层面增加约束,保证后续fips和customer_id的组合不会再重复:
ALTER TABLE 你的表名 ADD UNIQUE INDEX uk_fips_customer_id (fips, customer_id);
注意事项
- 新增主键列、删除数据、新增约束的操作都会锁表,若表数据量较大,建议在业务低峰期执行,避免影响正常业务。
- 执行删除操作前务必先备份全表数据,避免误删数据无法恢复。
内容的提问来源于stack exchange,提问作者kid_drew
相关产品推荐
相关产品推荐

