PostgreSQL分割槽表、繼承表記錄去重方法
背景
當使用資料庫分割槽或繼承功能,在PK層面上出現分割槽與分割槽,或分割槽與主表出現了重複的鍵值時,可以通過tableoid進行甄別,同時通過ONLY TABLE的操作方法進行刪除。
select tableoid::regclass
delete|select|update|truncate only
例子
建立測試表、繼承分割槽,PK約束在獨立的分割槽或主表上
postgres=# create table p (id int primary key, info text, crt_time timestamp);
CREATE TABLE
postgres=# create table p0 (like p including all) inherits(p);
NOTICE: merging column “id” with inherited definition
NOTICE: merging column “info” with inherited definition
NOTICE: merging column “crt_time” with inherited definition
CREATE TABLE
postgres=# create table p1 (like p including all) inherits(p);
NOTICE: merging column “id” with inherited definition
NOTICE: merging column “info” with inherited definition
NOTICE: merging column “crt_time” with inherited definition
CREATE TABLE
postgres=# create table p2 (like p including all) inherits(p);
NOTICE: merging column “id” with inherited definition
NOTICE: merging column “info” with inherited definition
NOTICE: merging column “crt_time” with inherited definition
CREATE TABLE
postgres=# create table p3 (like p including all) inherits(p);
NOTICE: merging column “id” with inherited definition
NOTICE: merging column “info” with inherited definition
NOTICE: merging column “crt_time” with inherited definition
CREATE TABLE
往不同的分割槽寫入PK重複的資料
postgres=# insert into p values (1,`test`,now());
INSERT 0 1
postgres=# insert into p0 values (1,`test`,now());
INSERT 0 1
postgres=# insert into p1 values (1,`test`,now());
INSERT 0 1
postgres=# insert into p2 values (1,`test`,now());
INSERT 0 1
查詢,你可能會不知道記錄屬於哪個表
postgres=# select * from p;
id | info | crt_time |
---|---|---|
1 | test | 2018-10-22 09:26:55.456769 |
1 | test | 2018-10-22 09:26:58.441338 |
1 | test | 2018-10-22 09:27:01.149731 |
1 | test | 2018-10-22 09:27:03.389089 |
(4 rows)
通過tableoid進行甄別
postgres=# select tableoid::regclass,* from p;
tableoid | id | info | crt_time |
---|---|---|---|
p | 1 | test | 2018-10-22 09:26:55.456769 |
p0 | 1 | test | 2018-10-22 09:26:58.441338 |
p1 | 1 | test | 2018-10-22 09:27:01.149731 |
p2 | 1 | test | 2018-10-22 09:27:03.389089 |
(4 rows)
直接指定PK刪除主表時,會將所有記錄刪除。
postgres=# delete from p where id=1;
DELETE 4
postgres=# select tableoid::regclass,* from p;
(0 rows)
delete|select|update|truncate only 清除指定分割槽的資料
https://www.postgresql.org/docs/11/static/sql-delete.html
通過only關鍵字,可以指定只操作當前表,不包括繼承或子繼承的表.
postgres=# insert into p values (1,`test`,now());
INSERT 0 1
postgres=# insert into p0 values (1,`test`,now());
INSERT 0 1
postgres=# insert into p1 values (1,`test`,now());
INSERT 0 1
postgres=# insert into p2 values (1,`test`,now());
INSERT 0 1
postgres=# delete from only p where id=1;
DELETE 1
postgres=# select tableoid::regclass,* from p;
tableoid | id | info | crt_time |
---|---|---|---|
p0 | 1 | test | 2018-10-22 09:27:47.510151 |
p1 | 1 | test | 2018-10-22 09:27:49.366293 |
p2 | 1 | test | 2018-10-22 09:27:51.255673 |
(3 rows)
postgres=# delete from only p2 where id=1;
DELETE 1
postgres=# select tableoid::regclass,* from p;
tableoid | id | info | crt_time |
---|---|---|---|
p0 | 1 | test | 2018-10-22 09:27:47.510151 |
p1 | 1 | test | 2018-10-22 09:27:49.366293 |
(2 rows)
如果是單張表內的資料去重,請參考末尾連線。
參考
《PostgreSQL 資料去重方法大全》
轉自阿里雲德哥
相關文章
- PostgreSQL使用表繼承實現分割槽表SQL繼承
- PostgreSQL學習手冊(表的繼承和分割槽)SQL繼承
- PostgreSQL LIST分割槽實現:繼承表+函式+觸發器。SQL繼承函式觸發器
- PostgreSQL 表繼承SQL繼承
- PostgreSQL:表繼承SQL繼承
- postgresql分割槽表SQL
- postgresql 9.6 分割槽表測試方案與記錄SQL
- PostgreSQL:傳統分割槽表SQL
- PostgreSQL:內建分割槽表SQL
- postgresql表如何去重SQL
- PostgreSQL/LightDB 分割槽表之分割槽裁剪SQL
- PostgreSQL分割槽表更新思路SQL
- postgresql分割槽表實現方式SQL
- postgresql分割槽表修改資料表欄位SQL
- 學習筆記】分割槽表和分割槽索引——新增表分割槽(二)筆記索引
- rebuild分割槽表分割槽索引的方法Rebuild索引
- PostgreSQL和oracle表分割槽對比SQLOracle
- 【學習筆記】分割槽表和分割槽索引——分割槽表的其他管理(三)筆記索引
- oracle分割槽表和分割槽表exchangeOracle
- mysql分割槽表筆記MySql筆記
- PostgreSQL10.0內建分割槽表SQL
- 使用線上重定義方法改造普通表為分割槽表實戰
- oracle分割槽表和非分割槽表exchangeOracle
- Oracle普通表修改為分割槽表的方法Oracle
- 全面學習分割槽表及分割槽索引(13)--分隔表分割槽索引
- 分割槽表學習筆記筆記
- 線上重定義分割槽表和NOLOGGING APPEND分割槽表對比APP
- 【學習筆記】分割槽表和分割槽索引——管理索引分割槽(四)筆記索引
- 全面學習分割槽表及分割槽索引(9)--刪除表分割槽索引
- 全面學習分割槽表及分割槽索引(11)--合併表分割槽索引
- 全面學習分割槽表及分割槽索引(12)--修改list表分割槽索引
- ORACLE 線上重新定義表分割槽表重定義為普通表。Oracle
- 使用DBMS_REDEFINITION線上重定義表普通表為分割槽表
- Oracle分割槽表及分割槽索引Oracle索引
- INTERVAL分割槽表鎖分割槽操作
- (3) MySQL分割槽表使用方法MySql
- 分割槽表和dbms_redefinition包線上重定義表
- PostgreSQL11preview-分割槽表增強彙總SQLView