PostgreSQL 庫如何去除單表重複資料呢?可以通過 ctid 進行,下面是實驗過程。
一、建立測試表
代碼如下 |
複製代碼 |
david=# create table emp ( david(# id int, david(# name varchar); CREATE TABLE david=# |
二、插入測試資料
代碼如下 |
複製代碼 |
david=# insert into emp values (1, 'david'); INSERT 0 1 david=# insert into emp values (1, 'david'); INSERT 0 1 david=# insert into emp values (1, 'david'); INSERT 0 1 david=# insert into emp values (2, 'sandy'); INSERT 0 1 david=# insert into emp values (2, 'sandy'); INSERT 0 1 david=# insert into emp values (3, 'renee'); INSERT 0 1 david=# insert into emp values (4, 'jack'); INSERT 0 1 david=# insert into emp values (5, 'rose'); INSERT 0 1 david=#
|
三、查詢初始化資料
代碼如下 |
複製代碼 |
david=# select ctid, * from emp; ctid | id | name -------+----+------- (0,1) | 1 | david (0,2) | 1 | david (0,3) | 1 | david (0,4) | 2 | sandy (0,5) | 2 | sandy (0,6) | 3 | renee (0,7) | 4 | jack (0,8) | 5 | rose (8 rows)
david=# |
查詢重複資料數
代碼如下 |
複製代碼 |
david=# select distinct id, count(*) from emp group by id having count(*) > 1; id | count ----+------- 1 | 3 2 | 2 (2 rows)
david=# |
查詢出 id 為1的記錄有3條,id 為2的記錄有2條。
四、查詢要保留的資料
以 min(ctid) 或 max(ctid) 為準。
代碼如下 |
複製代碼 |
david=# select ctid, * from emp where ctid in (select min(ctid) from emp group by id); ctid | id | name -------+----+------- (0,1) | 1 | david (0,4) | 2 | sandy (0,6) | 3 | renee (0,7) | 4 | jack (0,8) | 5 | rose (5 rows)
david=# |
五、重複資料刪除資料
代碼如下 |
複製代碼 |
david=# delete from emp where ctid not in (select min(ctid) from emp group by id); DELETE 3 david=# |
六、查看最後結果
代碼如下 |
複製代碼 |
david=# select ctid, * from emp; ctid | id | name -------+----+------- (0,1) | 1 | david (0,4) | 2 | sandy (0,6) | 3 | renee (0,7) | 4 | jack (0,8) | 5 | rose (5 rows)
|
david=# 說明:如果表中已經有標明唯一的序列主索引值,可以把該值替換上述的ctid直接刪除