Postgres去除表中重复数据行
Postgres去除表中重复数据行
采用PostgreSQL 9.2 官方文档例子为例:
1 CREATE TABLE weather ( 2 city varchar(80), 3 temp_lo int, -- low temperature 4 temp_hi int, -- high temperature 5 prcp real, -- precipitation 6 date date 7 ); 1 INSERT INTO weather VALUES 2 ('San Francisco', 46, 50, 0.25, '1994-11-27'), 3 ('San Francisco', 43, 57, 0, '1994-11-29'), 4 ('Hayward', 37, 54, NULL, '1994-11-29'), 5 ('Hayward', 37, 54, NULL, '1994-11-29'); --- duplicated row
这里有3中方法:
第一种:替换法
1 -- 剔除重复行的数据转存到新表weather_temp 2 SELECT DISTINCT city, temp_lo, temp_hi, prcp, date 3 INTO weather_temp 4 FROM weather; 5 -- 删除原表 6 DROP TABLE weather; 7 -- 将新表重命名为weather 8 ALTER TABLE weather_temp RENAME TO weather; 或者 1 -- 创建与weather一样的表weather_temp 2 CREATE TABLE weather_temp (LIKE weather INCLUDING CONSTRAINTS); 3 -- 用剔除重复行的数据填充到weather_temp中 4 INSERT INTO weather_temp SELECT DISTINCT * FROM weather; 5 -- 删除原表 6 DROP TABLE weather; 7 -- 将新重命名为weather. 8 ALTER TABLE weather_temp RENAME TO weather;
通俗易懂,有很多毁灭性的操作如DROP,而且当数据量大时,耗时耗空间。不推荐。
第二种: 添加字段法
01 -- 添加一个新字段,类型为serial 02 ALTER TABLE weather ADD COLUMN id SERIAL; 03 -- 删除重复行 04 DELETE FROM weather WHERE id 05 NOT IN ( 06 SELECT max(id) 07 FROM weather 08 GROUP BY city, temp_lo, temp_hi, prcp, date 09 ); 10 -- 删除添加的字段 11 ALTER TABLE weather DROP COLUMN id;
需要添加字段,「暂时不知道Postgres是如何处理添加字段的,是直接在原表追加呢,还是复制原表组成新表呢?」,如果是原表追加,可能就会因为新字段的加入而导致分页(一般block: 8k),如果是复制的话那就罪过了。不好。
第三种:系统字段[查看 System Columns]
1 DELETE FROM weather 2 WHERE ctid 3 NOT IN ( 4 SELECT max(ctid) 5 FROM weather 6 GROUP BY city, temp_lo, temp_hi, prcp, date 7 );
针对性强[Postgres独有],但是简单。