采用PostgreSQL 9.2 官方文档例子为例: 剔除重复行的数据转存到新表weather_temp
采用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, 0, ‘1994-11-29’),
(‘Hayward’, 37, 54, NULL, ‘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, temp_lo, temp_hi, prcp, 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, temp_lo, temp_hi, prcp, date
);
针对性强[Postgres独有],但是简单。
PostgreSQL 的详细介绍:请点这里
PostgreSQL 的下载地址:请点这里
推荐阅读:
在PostgreSQL中如何删除重复记录
Ubuntu下LAPP(Linux+Apache+PostgreSQL+PHP)环境的配置与安装
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。
发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/1884221.html