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 LIST分割槽實現:繼承表+函式+觸發器。SQL繼承函式觸發器
- postgresql 9.6 分割槽表測試方案與記錄SQL
- PostgreSQL 表繼承SQL繼承
- PostgreSQL:表繼承SQL繼承
- PostgreSQL/LightDB 分割槽表之分割槽裁剪SQL
- PostgreSQL:傳統分割槽表SQL
- PostgreSQL:內建分割槽表SQL
- PostgreSQL分割槽表更新思路SQL
- postgresql表如何去重SQL
- oracle分割槽表和分割槽表exchangeOracle
- oracle分割槽表和非分割槽表exchangeOracle
- PostgreSQL/LightDB分割槽表之常見問題SQL
- 增加表分割槽時,為local分割槽索引指定不同表空間的方法索引
- PG的非分割槽表線上轉分割槽表
- (3) MySQL分割槽表使用方法MySql
- 【MYSQL】 分割槽表MySql
- MySQL資料表分割槽手記MySql
- PostgreSQL11preview-分割槽表增強彙總SQLView
- 線上重定義與普通表改為分割槽表
- oracle 分割槽表move和包含分割槽表的lob moveOracle
- 移動分割槽表和分割槽索引的表空間索引
- PostgreSQL 原始碼解讀(98)- 分割槽表#4(資料查詢路由#1-“擴充套件”分割槽表)SQL原始碼路由套件
- Oracle分割槽表基礎運維-07增加分割槽(3列表分割槽)Oracle運維
- Oracle分割槽表基礎運維-04列表分割槽Oracle運維
- 線上重定義方式將普通表修改為分割槽表
- MySQL 分割槽表探索MySql
- 分割槽表-實戰
- 非分割槽錶轉換成分割槽表
- [oracle] expdp 匯出分割槽表的分割槽Oracle
- PostgreSQL用CTE語法+繼承實現拆分大表SQL繼承
- oracle將表配置為分割槽表Oracle
- oracle 普通表-分割槽表改造流程Oracle
- Oracle分割槽表基礎運維-06分割槽表索引Oracle運維索引
- oracle 線上重新定義,普通表改變分割槽表,分割槽表可以更改型別、分割槽欄位等Oracle型別
- Oracle分割槽表基礎運維-01分割槽表分類Oracle運維
- hive學習筆記之四:分割槽表Hive筆記
- SQL Server大分割槽表沒有空分割槽的情況下如何擴充套件分割槽的方法SQLServer套件