欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識(shí)庫 > PostgreSQL中enable、disable和validate外鍵約束的實(shí)例

PostgreSQL中enable、disable和validate外鍵約束的實(shí)例

熱門標(biāo)簽:天津開發(fā)區(qū)地圖標(biāo)注app 地圖標(biāo)注要花多少錢 濟(jì)南外呼網(wǎng)絡(luò)電話線路 電銷機(jī)器人能補(bǔ)救房產(chǎn)中介嗎 移動(dòng)外呼系統(tǒng)模擬題 電話機(jī)器人怎么換人工座席 江蘇400電話辦理官方 400電話申請客服 廣州電銷機(jī)器人公司招聘

我就廢話不多說了,大家還是直接看實(shí)例吧~

postgres=# create table t1(a int primary key,b text,c date);
CREATE TABLE
postgres=# create table t2(a int primary key,b int references t1(a),c text);
CREATE TABLE
postgres=# insert into t1 (a,b,c) values(1,'aa',now());
INSERT 0 1
postgres=# insert into t1 (a,b,c) values(2,'bb',now());
INSERT 0 1
postgres=# insert into t2 (a,b,c) values (1,1,'aa');
INSERT 0 1
postgres=# insert into t2 (a,b,c) values (2,2,'aa');
INSERT 0 1
postgres=# \d t1
         Table "public.t1"
 Column | Type  | Collation | Nullable | Default
--------+---------+-----------+----------+---------
 a   | integer |      | not null |
 b   | text  |      |     |
 c   | date  |      |     |
Indexes:
  "t1_pkey" PRIMARY KEY, btree (a)
Referenced by:
  TABLE "t2" CONSTRAINT "t2_b_fkey" FOREIGN KEY (b) REFERENCES t1(a)
 
postgres=# \d t2
         Table "public.t2"
 Column | Type  | Collation | Nullable | Default
--------+---------+-----------+----------+---------
 a   | integer |      | not null |
 b   | integer |      |     |
 c   | text  |      |     |
Indexes:
  "t2_pkey" PRIMARY KEY, btree (a)
Foreign-key constraints:
  "t2_b_fkey" FOREIGN KEY (b) REFERENCES t1(a)
 
postgres=#

假設(shè)我們想通過腳本向表中加載一些數(shù)據(jù)。因?yàn)槲覀儾恢滥_本中加載的順序,我們決定將表t2上的外鍵約束禁用掉,在數(shù)據(jù)加載之后載開啟外鍵約束:

postgres=# alter table t2 disable trigger all;
ALTER TABLE
postgres=#

這里看起來可能有點(diǎn)奇怪,但是它的確禁用了外鍵約束。如果有其他外鍵約束,當(dāng)然也是被禁用了。

我們再來看看表t2:

postgres=# \d t2
         Table "public.t2"
 Column | Type  | Collation | Nullable | Default
--------+---------+-----------+----------+---------
 a   | integer |      | not null |
 b   | integer |      |     |
 c   | text  |      |     |
Indexes:
  "t2_pkey" PRIMARY KEY, btree (a)
Foreign-key constraints:
  "t2_b_fkey" FOREIGN KEY (b) REFERENCES t1(a)
Disabled internal triggers:
  "RI_ConstraintTrigger_c_75213" AFTER INSERT ON t2 FROM t1 NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE "RI_FKey_check_ins"()
  "RI_ConstraintTrigger_c_75214" AFTER UPDATE ON t2 FROM t1 NOT DEFERRABLE INITIALLY IMMEDIATE FOR EACH ROW EXECUTE PROCEDURE "RI_FKey_check_upd"()
 
postgres=#

關(guān)鍵字all將表上的其他內(nèi)部觸發(fā)器也禁用了,需要superser才可以執(zhí)行成功。

postgres=# create user abce with login password 'abce';
CREATE ROLE
postgres=# \c postgres abce
You are now connected to database "postgres" as user "abce".
postgres=> create table t3 ( a int primary key, b text, c date);
CREATE TABLE
postgres=> create table t4 ( a int primary key, b int references t3(a), c text);
CREATE TABLE
postgres=> alter table t4 disable trigger all;
ERROR: permission denied: "RI_ConstraintTrigger_c_75235" is a system trigger
postgres=>

那作為普通用戶,該如何禁用觸發(fā)器呢?

postgres=> alter table t4 disable trigger user;

具體語法為:

DISABLE TRIGGER [ trigger_name | ALL | USER ]

回到t1、t2表。

postgres=# select * from t1;
 a | b |   c   
---+----+------------
 1 | aa | 2020-11-04
 2 | bb | 2020-11-04
(2 rows)
 
postgres=# select * from t2;
 a | b | c 
---+---+----
 1 | 1 | aa
 2 | 2 | aa
(2 rows)
 
postgres=# insert into t2 (a,b,c) values (3,3,'cc');
INSERT 0 1
postgres=#

這里插入了一條在t1中不匹配的記錄,但是插入成功了。

postgres=# alter table t2 enable trigger all;
ALTER TABLE
postgres=# \d t2
         Table "public.t2"
 Column | Type  | Collation | Nullable | Default
--------+---------+-----------+----------+---------
 a   | integer |      | not null |
 b   | integer |      |     |
 c   | text  |      |     |
Indexes:
  "t2_pkey" PRIMARY KEY, btree (a)
Foreign-key constraints:
  "t2_b_fkey" FOREIGN KEY (b) REFERENCES t1(a)
 
postgres=# alter table t2 validate constraint t2_b_fkey;
ALTER TABLE
postgres=#

是不是很驚訝,PostgreSQL沒有報(bào)告不匹配的記錄。為什么呢?

查看一個(gè)pg_constraint:

postgres=# select * from pg_constraint where conname='t2_b_fkey' and conrelid='t2'::regclass;
-[ RECORD 1 ]-+----------
conname    | t2_b_fkey
connamespace | 2200
contype    | f
condeferrable | f
condeferred  | f
convalidated | t
conrelid   | 75202
contypid   | 0
conindid   | 75200
conparentid  | 0
confrelid   | 75194
confupdtype  | a
confdeltype  | a
confmatchtype | s
conislocal  | t
coninhcount  | 0
connoinherit | t
conkey    | {2}
confkey    | {1}
conpfeqop   | {96}
conppeqop   | {96}
conffeqop   | {96}
conexclop   |
conbin    |
consrc    |
 
postgres=#

convalidated字段的值為t,表明該外鍵約束還是有效的。

哪怕是我們再次將其disable,仍然會(huì)顯示是有效的:

postgres=# alter table t2 disable trigger all;
ALTER TABLE
postgres=# select * from pg_constraint where conname='t2_b_fkey' and conrelid='t2'::regclass;
-[ RECORD 1 ]-+----------
conname    | t2_b_fkey
connamespace | 2200
contype    | f
condeferrable | f
condeferred  | f
convalidated | t
conrelid   | 75202
contypid   | 0
conindid   | 75200
conparentid  | 0
confrelid   | 75194
confupdtype  | a
confdeltype  | a
confmatchtype | s
conislocal  | t
coninhcount  | 0
connoinherit | t
conkey    | {2}
confkey    | {1}
conpfeqop   | {96}
conppeqop   | {96}
conffeqop   | {96}
conexclop   |
conbin    |
consrc    |
 
postgres=#

這表明當(dāng)我們開啟(enable)內(nèi)部觸發(fā)器的時(shí)候,PostgreSQL不會(huì)驗(yàn)證(validate)約束,因此也不會(huì)驗(yàn)證數(shù)據(jù)是否會(huì)有沖突,因?yàn)橥怄I約束的狀態(tài)始終是有效的。

我們需要做的是先將其變成無效的:

postgres=# alter table t2 alter CONSTRAINT t2_b_fkey not valid;
ERROR: ALTER CONSTRAINT statement constraints cannot be marked NOT VALID
## 需要先將外鍵刪掉,然后重建外鍵約束并將其狀態(tài)設(shè)置成無效
 
postgres=# alter table t2 drop constraint t2_b_fkey;
ALTER TABLE
postgres=# delete from t2 where a in (3);
DELETE 1
postgres=# alter table t2 add constraint t2_b_fkey foreign key (b) references t1(a) not valid;
ALTER TABLE
postgres=# \d t2
         Table "public.t2"
 Column | Type  | Collation | Nullable | Default
--------+---------+-----------+----------+---------
 a   | integer |      | not null |
 b   | integer |      |     |
 c   | text  |      |     |
Indexes:
  "t2_pkey" PRIMARY KEY, btree (a)
Foreign-key constraints:
  "t2_b_fkey" FOREIGN KEY (b) REFERENCES t1(a) NOT VALID

現(xiàn)在,可以看到狀態(tài)是無效的了:

postgres=# select * from pg_constraint where conname='t2_b_fkey' and conrelid='t2'::regclass;
-[ RECORD 1 ]-+----------
conname    | t2_b_fkey
connamespace | 2200
contype    | f
condeferrable | f
condeferred  | f
convalidated | f
conrelid   | 75202
contypid   | 0
conindid   | 75200
conparentid  | 0
confrelid   | 75194
confupdtype  | a
confdeltype  | a
confmatchtype | s
conislocal  | t
coninhcount  | 0
connoinherit | t
conkey    | {2}
confkey    | {1}
conpfeqop   | {96}
conppeqop   | {96}
conffeqop   | {96}
conexclop   |
conbin    |
consrc    |
 
postgres=#

繼續(xù)插入數(shù)據(jù):

postgres=# insert into t2(a,b,c) values (3,3,'cc');
ERROR: insert or update on table "t2" violates foreign key constraint "t2_b_fkey"
DETAIL: Key (b)=(3) is not present in table "t1".
postgres=#

是不是更驚訝了?創(chuàng)建了一個(gè)無效的約束,只是通知PostgreSQL

不要掃描整個(gè)表去驗(yàn)證所有的行記錄是否有效。對于新插入或更新的行,仍然會(huì)檢查是否滿足約束條件,這就是為什么上面插入失敗了。

我們該怎么做呢?

1.刪除所有的外鍵

2.加載數(shù)據(jù)

3.重新創(chuàng)建外鍵,但是將其狀態(tài)設(shè)置成無效的,從而避免掃描整個(gè)表。之后,新的數(shù)據(jù)會(huì)被驗(yàn)證了

4.在系統(tǒng)負(fù)載低的時(shí)候開啟約束驗(yàn)證(validate the constraints)

另一種方法是:

postgres=# alter table t2 alter constraint t2_b_fkey deferrable;
ALTER TABLE
postgres=# begin;
BEGIN
postgres=# set constraints all deferred;
SET CONSTRAINTS
postgres=# insert into t2 (a,b,c) values (3,3,'cc');
INSERT 0 1
postgres=# insert into t2 (a,b,c) values (4,4,'dd');
INSERT 0 1
postgres=# insert into t1 (a,b,c) values (3,'cc',now());
INSERT 0 1
postgres=# insert into t1 (a,b,c) values (4,'dd',now());
INSERT 0 1
postgres=# commit;
COMMIT

這樣做不好的方面是,在下一次提交時(shí)才起作用,因此,你需要將所有的工作放到一個(gè)事務(wù)中。

本文的關(guān)鍵點(diǎn)是,下面的假設(shè)將驗(yàn)證你的數(shù)據(jù)是錯(cuò)誤的:

postgres=# alter table t2 disable trigger all;
ALTER TABLE
postgres=# insert into t2 (a,b,c) values (5,5,'ee');
INSERT 0 1
postgres=# alter table t2 enable trigger all;
ALTER TABLE
postgres=#

這只會(huì)驗(yàn)證新的數(shù)據(jù),但是并不保證所有的數(shù)據(jù)都滿足約束:

postgres = # insert into t2 (a,b,c) values (6,6,'ff');
ERROR: insert or update on table "t2" violates foreign key constraint "t2_b_fkey"
DETAIL: Key(b) = (6) is not present in table "t1".
postgres = # select * from t2 where b = 5;
a | b | c
---+---+----
5 | 5 | ee
(1 row)
 
postgres = # select * from t1 where a = 5;
a | b | c
---+---+---
(0 rows)

最終,還有一種方式來解決,直接修改pg_constraint目錄表。但是并建議用戶這么做!

postgres=# delete from t2 where b = 5;
DELETE 1
postgres=# delete from t2 where b = 5;
DELETE 1
postgres=# alter table t2 disable trigger all;
ALTER TABLE
postgres=# insert into t2 values (5,5,'ee');
INSERT 0 1
postgres=# alter table t2 enable trigger all;
ALTER TABLE
postgres=# update pg_constraint set convalidated = false where conname = 't2_b_fkey' and conrelid = 't2'::regclass;
UPDATE 1
postgres=# alter table t2 validate constraint t2_b_fkey;
ERROR: insert or update on table "t2" violates foreign key constraint "t2_b_fkey"
DETAIL: Key (b)=(5) is not present in table "t1".
postgres=#

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • PostgreSQL 查看表的主外鍵等約束關(guān)系詳解
  • postgresql 實(shí)現(xiàn)字符串分割字段轉(zhuǎn)列表查詢
  • postgresql 查詢集合結(jié)果用逗號(hào)分隔返回字符串處理的操作
  • postgresql數(shù)據(jù)庫連接數(shù)和狀態(tài)查詢操作
  • postgresql查詢自動(dòng)將大寫的名稱轉(zhuǎn)換為小寫的案例
  • postgresql數(shù)據(jù)庫使用說明_實(shí)現(xiàn)時(shí)間范圍查詢
  • Postgresql 查詢表引用或被引用的外鍵操作

標(biāo)簽:辛集 杭州 寶雞 溫州 濮陽 榆林 海西 昭通

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PostgreSQL中enable、disable和validate外鍵約束的實(shí)例》,本文關(guān)鍵詞  PostgreSQL,中,enable,disable,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PostgreSQL中enable、disable和validate外鍵約束的實(shí)例》相關(guān)的同類信息!
  • 本頁收集關(guān)于PostgreSQL中enable、disable和validate外鍵約束的實(shí)例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    国产91丝袜在线播放九色| 欧美日韩人妻精品一区在线| av毛片久久久久**hd| 在线观看一区二区三区四区| 人妻av无码一区二区三区| 一本一道综合狠狠老| 日韩一区二区电影| 日韩一区欧美小说| 日本不卡的三区四区五区| 高清在线观看日韩| 国产熟女高潮一区二区三区| 污软件在线观看| 91精品欧美一区二区三区综合在| 国产三级精品视频| 亚洲一二三四区不卡| 国产揄拍国内精品对白| 国产精品日日摸夜夜爽| 最新黄色av网址| 91精品视频网| 亚洲欧美日韩国产综合| 精品综合免费视频观看| 韩国av中国字幕| 四虎永久免费在线| 精品少妇一区二区三区在线播放 | 懂色av粉嫩av蜜乳av| 日韩成人短视频| 欧美xxxxxxxxx| 亚洲一二三级电影| 成人性生交大片免费看视频在线 | 精品99久久久久久| 亚洲老妇xxxxxx| 国产精品资源网站| 少妇精品一区二区| 欧美色综合久久| 国产精品久久久久婷婷| 久久99热国产| 中文字幕一区二区人妻电影丶| 69xx绿帽三人行| 国产片一区二区| 日韩精品一级二级 | 国产白丝精品91爽爽久久| 星空大象在线观看免费播放| 色婷婷久久久亚洲一区二区三区| 国产亚洲成av人在线观看导航| 日韩精品电影一区亚洲| 精品国产aⅴ一区二区三区东京热| 中国一级片在线观看| 久久理论电影网| 秋霞午夜鲁丝一区二区老狼| av地址在线观看| 色激情天天射综合网| 国产精品色哟哟| 国产精品自拍三区| 欧美自拍偷拍网| 久久亚洲精品国产精品紫薇| 免费在线观看一区| 中文字幕日韩三级片| 91精品国模一区二区三区| 亚洲成人自拍一区| 久久精品aⅴ无码中文字字幕重口| 91成人免费电影| 亚洲男人天堂av| 99精品视频在线观看免费| 麻豆精品一区二区三区视频| 国产精品久久福利| 成人黄色免费短视频| 日韩在线中文字幕视频| 国产精品乱码人人做人人爱| 国产精品 欧美精品| 久久成人小视频| 国产精品福利一区二区| yourporn久久国产精品| 日本道在线观看一区二区| 亚洲免费视频中文字幕| 无码人妻少妇色欲av一区二区| 91精品办公室少妇高潮对白| 亚洲精品免费电影| 精品无码av一区二区三区| 欧美日本不卡视频| 天天影视色香欲综合网老头| 你懂的在线观看网站| 日韩欧美电影一区| 九九国产精品视频| 亚洲人做受高潮| 亚洲欧美激情视频在线观看一区二区三区| 99在线精品免费| 欧美日韩国产片| 日本午夜精品视频在线观看| 久久久久久久久久久久| 欧美激情一二三区| 国产亚洲精品中文字幕| 国产精品综合一区二区| 色综合视频在线观看| 一区二区三区小说| 800av在线播放| 久久网站最新地址| 成人理论电影网| 欧美日韩国产一级片| 免费欧美高清视频| 91香蕉视频网| 一区二区免费视频| 亚洲成人日韩在线| 国产欧美一区二区三区在线看蜜臀 | 亚洲不卡av一区二区三区| 成人性生活免费看| 久久午夜羞羞影院免费观看| 风间由美一区二区三区在线观看| 91国偷自产一区二区使用方法| 性久久久久久久| 国产18无套直看片| 亚洲另类在线视频| 97伦伦午夜电影理伦片| 欧美国产日韩一二三区| 四川一级毛毛片| 精品卡一卡二卡三卡四在线| 国产91丝袜在线播放| 欧美日本一区二区三区四区| 精品一区二区免费| 欧美在线视频你懂得| 蜜桃视频免费观看一区| 色综合久久久久综合体桃花网| 午夜精品久久一牛影视| 日韩av网站在线播放| 亚洲午夜久久久久久久久电影网 | 色综合久久精品| 日韩成人午夜电影| 91精品一区二区三区蜜桃| 天天色综合天天| 亚洲天堂黄色片| 免费一区二区视频| 在线一区二区三区四区五区 | 久久久综合视频| 无码国产精品久久一区免费| 久久免费视频一区| 色综合久久久无码中文字幕波多| www精品美女久久久tv| 91麻豆精品秘密| 国产亚洲欧美色| 在线看黄色的网站| 国产精品乱码一区二区三区软件 | 成人免费在线视频| 伊人网在线视频观看| 一区二区三区在线观看欧美| 欧美波霸videosex极品| 亚洲6080在线| 日本精品裸体写真集在线观看| 69久久99精品久久久久婷婷 | 美女诱惑一区二区| 六十路息与子猛烈交尾| 中文字幕在线不卡| 无码人妻aⅴ一区二区三区69岛| 一区二区三区在线看| 中文乱码字幕高清一区二区| 日本特黄久久久高潮| 欧美日韩一级二级| 99天天综合性| 欧美极品xxx| 性欧美一区二区| 日日摸夜夜添夜夜添国产精品| 色婷婷综合激情| 国产成人免费av在线| 精品成人在线观看| 国产xxxx视频| 亚洲午夜一区二区| 在线视频观看一区| 成人久久18免费网站麻豆| 久久色在线观看| 国产交换配乱淫视频免费| 午夜视频一区二区| 欧美视频在线一区二区三区| 成人免费毛片嘿嘿连载视频| 国产欧美中文在线| 九九九视频在线观看| 久久激情五月激情| 日韩欧美亚洲一区二区| a天堂视频在线观看| 午夜精品视频在线观看| 欧美年轻男男videosbes| 香蕉网在线视频| 一区二区欧美国产| 欧美主播一区二区三区| 91片在线免费观看| 亚洲乱码国产乱码精品精可以看| 色综合久久久久综合体| 成人18精品视频| 亚洲少妇30p| 色丁香久综合在线久综合在线观看| 成人午夜私人影院| 国产精品精品国产色婷婷| 国产精品嫩草影院俄罗斯| 东方欧美亚洲色图在线| 中文字幕中文在线不卡住| 色综合咪咪久久| 91美女福利视频| 一区二区免费在线播放| 欧美美女一区二区三区| 伊人网综合视频| 免费xxxx性欧美18vr| 久久欧美中文字幕| 久久国产精品国语对白|