`
redish
  • 浏览: 31255 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

PostgreSQL删除表中重复数据行

 
阅读更多
采用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中,行可见性验证会涉及对事务ID的比较,以判断数据行是否被创建或修改于当前事务开始之前,并且是否被删除。具体来说,如果数据行的t_xmin(创建事务ID)是在当前事务开始之前,并且t_xmax(删除事务ID...

    如何恢复PostgreSQL数据库

    PostgreSQL 是一个功能强大且广泛使用的开源关系数据库管理系统,但是在实际应用中,数据库崩溃或无法启动的情况时有发生。这时,如何恢复 PostgreSQL 数据库变得非常重要。下面将详细介绍如何恢复 PostgreSQL ...

    PostgreSQL从菜鸟到专家 中译稿 by 洞庭湖的泥鳅

    PostgreSQL遵循关系数据模型,这意味着数据被组织成表格,每个表格由列和行构成,列定义数据类型,行代表具体实例。 **查询语言** PostgreSQL 支持SQL,一种标准化的查询语言,用于插入、查询、更新和删除数据。...

    Postgresql从入门到精通

    2. 使用基本的psql命令,如SELECT语句,以及如何覆盖列名、控制行的顺序和消除重复数据。 3. 执行计算、选择行、使用复杂的条件、模式匹配以及限制结果集。 4. 检查空值NULL、时间和日期,以及设置时间和日期的风格...

    PostgreSQL从菜鸟到专家

    - **使用基本的INSERT语句**:如何向表中插入一行数据。 - **使用更安全的插入语句**:参数化查询以防止SQL注入。 - **插入数据到serial类型的列中**:自动递增的字段。 - **插入空值**:如何正确插入NULL值。 - **...

    PostgreSQL从入门到精通

    2. 基本的psql命令:讲解了使用psql执行SQL命令的方法,包括SELECT语句的使用、控制输出顺序、消除重复数据等。 3. 多个表协同工作:讨论了如何使用SQL语句操作多个表,包括表的关联、别名的使用以及表的连接。 4. ...

    PostgreSQL 行可见性验证实践手册

    本文将深入探讨 PostgreSQL 中的行可见性验证、事务ID结构、元组结构以及插入、删除和更新元组的过程。 1. **行可见性验证规则** 在 PostgreSQL 中,行的可见性取决于事务的隔离级别。数据库支持以下四种隔离级别...

    POSTGRESQL7数据库开发指南

    在PostgreSQL7中,可以使用CREATE TABLE语句创建表,ALTER TABLE用于修改表结构,DROP TABLE则用于删除表。 **5. 触发器与存储过程** 触发器是自动执行的程序,常用于实现业务规则。存储过程是一组可重复使用的SQL...

    sql+如何去重复数据

    5. **ROW_NUMBER()函数**:在支持窗口函数的数据库系统(如SQL Server, PostgreSQL)中,可以利用`ROW_NUMBER()`生成行号,结合`PARTITION BY`和`ORDER BY`来标记重复行,然后删除非首行。例如: ```sql WITH ...

    PostgreSQL Developer s Guide

    - **行类型变量**: 表示表中一行的所有列。 - **记录类型变量**: 用户自定义的复合数据类型,可以包含不同类型的字段。 ##### 6. Statements and Expressions - **赋值**: 使用`:=`进行赋值操作。 - **函数调用**: ...

    postgresql8_doc

    1. **数据查询**:使用 `SELECT` 语句从表中获取数据。 2. **数据插入**:使用 `INSERT INTO` 语句将新记录插入表中。 3. **数据更新**:使用 `UPDATE` 语句修改已存在的记录。 4. **数据删除**:使用 `DELETE FROM`...

    PostgreSQL数据库

    在扁平文件中,重复数据可能导致数据冗余和一致性问题。数据库管理系统通过建立表和关系来解决这些问题,确保数据的一致性和完整性。PostgreSQL提供了丰富的约束机制,如唯一性约束、外键约束,来维护数据的完整性和...

    PostgreSQL数据库培训学习手册 .pdf

    在PostgreSQL中,数据表是最基本的数据存储单元,它由行和列组成。在创建表时,我们可以定义列的数据类型、默认值、是否允许空值(NULL)、约束条件(比如唯一性约束和检查约束)以及是否为自增字段。接下来将详细...

    PostgreSQL 中文手册(书签全)

    表继承允许在PostgreSQL中创建继承关系,子表继承父表的结构和数据。这种机制非常适用于实现“类”级别的继承概念,使得数据库设计更加灵活。 #### 表的分区 分区是一种将大表分割成较小部分的方法,可以提高查询...

    postgresql相关资料

    PostgreSQL是一种开源的...无论是在数据密集型的互联网应用,还是在需要高级数据处理能力的企业级应用中,PostgreSQL都能提供稳定且高效的服务。了解并掌握这些知识点,对于成为一名熟练的PostgreSQL开发者至关重要。

    PostgreSQL慢SQL调优手册

    将复杂的数据定义拆分成更小的操作,例如,分步创建表、添加列和索引。 10、**Comprehensive Optimization** 全面优化包括但不限于上述技术,还包括检查查询执行计划,分析慢查询日志,调整系统参数,以及使用性能...

    postgresql中文手册

    **表的继承允许一个表继承另一个表的结构, 这有助于减少重复的数据定义工作。** 1. **表的继承** - 示例: ```sql CREATE TABLE base_table (id serial PRIMARY KEY, data text); CREATE TABLE derived_table ...

    PostgreSQL建立索引如何避免写数据锁定

    2. 如果索引构建过程中出现问题,如数据重复或中途取消,会创建一个无效的索引记录。 如果遇到因问题导致的无效索引,有两种重建方法: 1. 先使用`DROP INDEX index_name`删除无效索引,然后再执行`CREATE INDEX ...

    后端面试题汇总(Python、Redis、MySQL、PostgreSQL、Kafka、数据结构、算法、编程、网络).zip

    在IT领域,尤其是在后端开发的面试过程中,数据结构是不可或缺的重要知识点。它构成了计算机科学的基础,对于理解和解决复杂问题至关重要。数据结构是组织、管理、存储和检索数据的高效方式,它涉及到如何在计算机中...

Global site tag (gtag.js) - Google Analytics