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