婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > PostgreSQL 查看表的主外鍵等約束關(guān)系詳解

PostgreSQL 查看表的主外鍵等約束關(guān)系詳解

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

我就廢話不多說了,大家還是直接看代碼吧~

SELECT
   tc.constraint_name, tc.table_name, kcu.column_name, 
   ccu.table_name AS foreign_table_name,
   ccu.column_name AS foreign_column_name,
   tc.is_deferrable,tc.initially_deferred
 FROM 
   information_schema.table_constraints AS tc 
   JOIN information_schema.key_column_usage AS kcu ON tc.constraint_name = kcu.constraint_name
   JOIN information_schema.constraint_column_usage AS ccu ON ccu.constraint_name = tc.constraint_name
 WHERE constraint_type = 'FOREIGN KEY' AND tc.table_name = 'your table name';

constraint_type有四種:

UNIQUE、PRIMARY KEY、CHECK、FOREIGN KEY

通過修改上邊sql語句的table_name和constraint_type來進行相應(yīng)的查詢

補充:PostgreSQL查詢約束和創(chuàng)建刪除約束

查詢約束constraint

SELECT
   tc.constraint_name, tc.table_name, kcu.column_name, 
   ccu.table_name AS foreign_table_name,
   ccu.column_name AS foreign_column_name,
   tc.is_deferrable,tc.initially_deferred
 FROM 
   information_schema.table_constraints AS tc 
   JOIN information_schema.key_column_usage AS kcu ON tc.constraint_name = kcu.constraint_name
   JOIN information_schema.constraint_column_usage AS ccu ON ccu.constraint_name = tc.constraint_name
 WHERE constraint_type = 'UNIQUE' AND tc.table_name = 'table_name'; 

constraint_type有四種:

UNIQUE、PRIMARY KEY、CHECK、FOREIGN KEY, 通過修改上邊sql語句的table_name和constraint_type來進行相應(yīng)的查詢。

添加約束

ALTER TABLE table_name ADD CONSTRAINT uk_users_name1 UNIQUE (NAME);

刪除約束

alter table table_name drop constraint if EXISTS uk_users_name1;

補充:PostgreSQL的依賴約束(系統(tǒng)表pg_depend和pg_constraint)詳解

pg_depend是postgres的一張系統(tǒng)表,用來記錄數(shù)據(jù)庫對象之間的依賴關(guān)系,除了常見的主外鍵,還有其他一些內(nèi)部依賴關(guān)系,可以通過這個系統(tǒng)表呈現(xiàn)出來。

一、表結(jié)構(gòu):

postgres=# \d+ pg_depend
            Table "pg_catalog.pg_depend"
  Column  | Type  | Modifiers | Storage | Stats target | Description
-------------+---------+-----------+---------+--------------+-------------
 classid   | oid   | not null | plain  |       | 系統(tǒng)OID
 objid    | oid   | not null | plain  |       | 對象OID
 objsubid  | integer | not null | plain  |       |
 refclassid | oid   | not null | plain  |       | 引用系統(tǒng)OID
 refobjid  | oid   | not null | plain  |       | 引用對象ID
 refobjsubid | integer | not null | plain  |       |
 deptype   | "char" | not null | plain  |       | pg_depend類型
Indexes:
  "pg_depend_depender_index" btree (classid, objid, objsubid)
  "pg_depend_reference_index" btree (refclassid, refobjid, refobjsubid)
Has OIDs: no

--BTW:OID是Object Identifier的縮寫,是對象ID的意思,因為是無符號的4字節(jié)類型,不夠足夠大,所以一般不用來做主鍵使用,僅系統(tǒng)內(nèi)部,比如系統(tǒng)表等應(yīng)用,可以與一些整型數(shù)字進行轉(zhuǎn)換。與之相關(guān)的系統(tǒng)參數(shù)是default_with_oids,默認是off

postgres=# \d pg_constraint
   Table "pg_catalog.pg_constraint"
  Column   |   Type   | Modifiers 
---------------+--------------+-----------
 conname    | name     | not null    -- 約束名
 connamespace | oid     | not null    -- 約束所在命名空間的OID
 contype    | "char"    | not null    -- 約束類型
 condeferrable | boolean   | not null    -- 約束是否可以推遲
 condeferred  | boolean   | not null    -- 缺省情況下,約束是否可以推遲
 convalidated | boolean   | not null    -- 約束是否經(jīng)過驗證
 conrelid   | oid     | not null    -- 約束所在的表的OID
 contypid   | oid     | not null    -- 約束所在的域的OID
 conindid   | oid     | not null    -- 如果是唯一、主鍵、外鍵或排除約束,則為支持這個約束的索引;否則為0
 confrelid   | oid     | not null    -- 如果是外鍵,則為參考的表;否則為 0
 confupdtype  | "char"    | not null    -- 外鍵更新操作代碼
 confdeltype  | "char"    | not null    -- 外鍵刪除操作代碼
 confmatchtype | "char"    | not null    -- 外鍵匹配類型
 conislocal  | boolean   | not null    
 coninhcount  | integer   | not null    -- 約束直接繼承祖先的數(shù)量
 connoinherit | boolean   | not null    
 conkey    | smallint[]  |     -- 如果是表約束(包含外鍵,但是不包含約束觸發(fā)器),則是約束字段的列表
 confkey    | smallint[]  |     -- 如果是一個外鍵,是參考的字段的列表
 conpfeqop   | oid[]    |     -- 如果是一個外鍵,是PK = FK比較的相等操作符的列表
 conppeqop   | oid[]    |    -- 如果是一個外鍵,是PK = PK比較的相等操作符的列表
 conffeqop   | oid[]    |     -- 如果是一個外鍵,是FK = FK比較的相等操作符的列表
 conexclop   | oid[]    |     -- 如果是一個排除約束,是每個字段排除操作符的列表
 conbin    | pg_node_tree |     -- 如果是一個檢查約束,那就是其表達式的內(nèi)部形式
 consrc    | text     |     -- 如果是檢查約束,則是表達式的人類可讀形式
Indexes:
  "pg_constraint_oid_index" UNIQUE, btree (oid)
  "pg_constraint_conname_nsp_index" btree (conname, connamespace)
  "pg_constraint_conrelid_index" btree (conrelid)
  "pg_constraint_contypid_index" btree (contypid)

pg_depend.deptype字段類型9.1之后多了一個extension的類型,目前類型有

DEPENDENCY_NORMAL (n)   :普通的依賴對象,如表與schema的關(guān)系
DEPENDENCY_AUTO (a)    :自動的依賴對象,如主鍵約束
DEPENDENCY_INTERNAL (i)  :內(nèi)部的依賴對象,通常是對象本身
DEPENDENCY_EXTENSION (e) :9.1新增的的擴展依賴
DEPENDENCY_PIN (p)    :系統(tǒng)內(nèi)置的依賴

二、例子

wiki上有一個SQL可以列出系統(tǒng)和用戶對象的各種依賴關(guān)系,低版本的可以看wiki上的另一個寫法

SELECT classid::regclass AS "depender object class",
  CASE classid
    WHEN 'pg_class'::regclass THEN objid::regclass::text
    WHEN 'pg_type'::regclass THEN objid::regtype::text
    WHEN 'pg_proc'::regclass THEN objid::regprocedure::text
    ELSE objid::text
  END AS "depender object identity",
  objsubid,
  refclassid::regclass AS "referenced object class",
  CASE refclassid
    WHEN 'pg_class'::regclass THEN refobjid::regclass::text
    WHEN 'pg_type'::regclass THEN refobjid::regtype::text
    WHEN 'pg_proc'::regclass THEN refobjid::regprocedure::text
    ELSE refobjid::text
  END AS "referenced object identity",
  refobjsubid,
  CASE deptype
    WHEN 'p' THEN 'pinned'
    WHEN 'i' THEN 'internal'
    WHEN 'a' THEN 'automatic'
    WHEN 'n' THEN 'normal'
  END AS "dependency type"
FROM pg_catalog.pg_depend WHERE (objid >= 16384 OR refobjid >= 16384);

BTW:我通常喜歡在where后面加個條件 and deptype >'i' 排除internal依賴

建一張普通的表,執(zhí)行上面的SQL

postgres=# create table tbl_parent(id int);
CREATE TABLE
postgres=# 執(zhí)行上面的SQL;
 depender object class | depender object identity | objsubid | referenced object class | referenced object identity | refobjsubid | dependency type
-----------------------+--------------------------+----------+-------------------------+------------- pg_class       | tbl_parent        |    0 | pg_namespace      | 2200            |      0 | normal
(1 row)

--普通用戶來看只是建了個表,但是沒有約束,其實因為這個表是建立在schema下面,表是依賴于schema上面的

加一個主鍵約束

postgres=# alter table tbl_parent add primary key(id);
ALTER TABLE
 depender object class | depender object identity | objsubid | referenced object class | referenced object identity | refobjsubid | dependency type
-----------------------+--------------------------+----------+-------------------------+------- pg_class       | tbl_parent        |    0 | pg_namespace      | 2200            |      0 | normal
 pg_constraint     | 16469          |    0 | pg_class        | tbl_parent         |      1 | automatic
(2 rows)

--多了一個約束的信息,下面的這條信息表明這個主鍵約束是依賴于表上的,并且是自動模式,詳細信息可以在系統(tǒng)表pg_constrant里面查詢

三、非正常刪除

正常情況下用戶刪除有依賴關(guān)系的對象時會提示需要先刪除最里層沒依賴的對象,但是如果通過刪除系統(tǒng)表,但又刪得不對,就會導(dǎo)致異常,比如上面這個例子會出現(xiàn) cache lookup failed for constraint

postgres=# select oid,conname,connamespace,contype from pg_constraint where conname like 'tbl_parent%';
 oid |   conname   | connamespace | contype
-------+-----------------+--------------+---------
 16469 | tbl_parent_pkey |     2200 | p
(1 row)
 
postgres=# delete from pg_constraint where conname like 'tbl_parent%';
DELETE 1
postgres=# select oid,conname,connamespace,contype from pg_constraint where conname like 'tbl_parent%';
 oid | conname | connamespace | contype
-----+---------+--------------+---------
(0 rows)
 
postgres=# drop table tbl_parent;
ERROR: cache lookup failed for constraint 16469  --16496是約束的OID
postgres=#

--出現(xiàn)這個問題,是因為手工把約束對象刪除了,但是在pg_depend依賴關(guān)系里面卻仍然存在關(guān)系,所以刪除該表時發(fā)現(xiàn)最里層的依賴對象找不到了就報錯了,

解決:

1.手工恢復(fù)該表的約束對象,比較難也比較煩

2.刪除該表所有的系統(tǒng)依賴信息 上面的問題需要刪除

postgres=# delete from pg_depend where objid = 16469 or refobjid = 16469 ;
DELETE 2
postgres=# drop table tbl_parent;
DROP TABLE

3.要說一點的是不要去手工刪除一些系統(tǒng)表信息來達到刪除約束的目的,容易因刪不干凈而造成各種異常

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

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

標簽:溫州 寶雞 昭通 榆林 海西 辛集 杭州 濮陽

巨人網(wǎng)絡(luò)通訊聲明:本文標題《PostgreSQL 查看表的主外鍵等約束關(guān)系詳解》,本文關(guān)鍵詞  PostgreSQL,查,看表,的,主外,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PostgreSQL 查看表的主外鍵等約束關(guān)系詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于PostgreSQL 查看表的主外鍵等約束關(guān)系詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    日本不卡视频在线| 久久不见久久见免费视频7| 亚洲色图制服诱惑 | 91麻豆精品国产综合久久久久久| 亚洲卡通动漫在线| 欧日韩精品视频| 成人午夜av在线| 欧美激情中文字幕| 99国产欧美另类久久久精品| 91麻豆免费看片| 99视频有精品| 国产剧情一区在线| 91玉足脚交白嫩脚丫在线播放| 色呦呦国产精品| 久久综合久久久久88| 国产视频一区在线播放| 国产精品无遮挡| 日本视频一区二区三区| 国精产品一区一区三区mba视频| 精品一二三四区| 日韩av在线发布| 成人一区二区三区视频在线观看| 在线看不卡av| 国产日产精品1区| 午夜精品久久久久久不卡8050| 国产麻豆日韩欧美久久| 成人精品国产一区二区4080 | 色婷婷久久久久swag精品| 国产美女精品一区二区三区| 国产精品免费久久| 国产精品一区二区不卡| 日韩一区二区三区在线观看| 国产精品久久久久久久岛一牛影视 | 国产伦精品一区二区三区免费迷| 男女激情视频一区| 亚洲一区二区三区四区的| 中文字幕在线观看不卡| 一区二区视频在线看| 中文字幕在线免费不卡| 久久亚洲综合av| 91麻豆精东视频| 亚洲国产成人91porn| 日韩一区二区三区在线| 欧美日韩一区中文字幕| 精品午夜久久福利影院| 亚洲精品大片www| 91丨九色丨蝌蚪丨老版| 午夜激情一区二区| 日韩一区二区电影在线| 国产一区二区三区免费观看| 久久夜色精品一区| 国产一区二区中文字幕| 亚洲欧洲成人精品av97| 丝袜诱惑制服诱惑色一区在线观看| 成人一级视频在线观看| 日韩精品一二三区| 亚洲免费观看在线观看| 久久综合99re88久久爱| 国产精品美女久久久久久久久久久| a级高清视频欧美日韩| 中文字幕在线观看不卡| 亚洲一二三四在线| 美日韩黄色大片| 午夜久久久久久久久| 欧美午夜在线观看| 一本大道久久a久久精品综合| 91黄色激情网站| 专区另类欧美日韩| 亚洲男人电影天堂| 亚洲精品中文在线观看| 亚洲高清免费观看 | 精品国产一区二区精华| 豆国产96在线|亚洲| 久久精品视频在线免费观看| 久久你懂得1024| 欧美一区二区三区在线| 国产婷婷精品av在线| 亚洲欧美怡红院| 精品视频一区二区三区免费| 国产成人午夜精品影院观看视频| 久久国产剧场电影| 韩国成人福利片在线播放| 精品伊人久久久久7777人| 日本视频一区二区| 亚洲日本乱码在线观看| 国产精品不卡在线观看| 国产精品免费av| 亚洲少妇最新在线视频| 一区二区三区四区中文字幕| 亚洲国产成人tv| 亚洲综合色丁香婷婷六月图片| 美女脱光内衣内裤视频久久网站| 老司机免费视频一区二区三区| 亚洲地区一二三色| 欧美挠脚心视频网站| 欧美激情艳妇裸体舞| 欧美私人免费视频| 日韩欧美国产1| 午夜精品久久久久久久99水蜜桃 | 亚洲成人免费视频| 国产不卡高清在线观看视频| 欧美日本韩国一区| 肉色丝袜一区二区| 色视频一区二区| 一区二区三区久久久| 日韩高清一区在线| 国产一区二区三区免费在线观看| 精彩视频一区二区三区| youjizz国产精品| 亚洲女人****多毛耸耸8| 国产精品短视频| 国产不卡一区视频| 国产色91在线| 国产a精品视频| 欧美精品一区二区三区四区| 欧美成人福利视频| 亚洲美女精品一区| 成人动漫在线一区| 一区在线观看视频| 91在线高清观看| 国产欧美视频在线观看| 国产精品456| 亚洲天堂a在线| 99免费精品视频| 丝袜诱惑亚洲看片| 94-欧美-setu| 欧美日韩成人在线一区| 91精品国产综合久久香蕉麻豆 | 国产黄色精品网站| 欧美精品一区二区精品网| 欧美欧美午夜aⅴ在线观看| 91.麻豆视频| 国产成人av一区二区| 国产精品久99| 成人丝袜高跟foot| 欧美日韩精品欧美日韩精品| 免费不卡在线观看| 欧美精品一区二区久久久| 玉足女爽爽91| 国产日产精品一区| 亚洲高清在线精品| 日本成人在线网站| 国产一区二区在线观看视频| 图片区小说区国产精品视频| 国产亚洲精品福利| 日韩制服丝袜av| 欧美偷拍一区二区| 亚洲乱码中文字幕| 一本久久a久久精品亚洲| 亚洲激情校园春色| 在线日韩av片| 污片在线观看一区二区| 7777精品伊人久久久大香线蕉| 亚洲无线码一区二区三区| 91亚洲精品乱码久久久久久蜜桃 | 国产精品91xxx| 国产亚洲精品精华液| 日本不卡视频在线观看| www久久精品| 大胆欧美人体老妇| 亚洲国产综合91精品麻豆| 91香蕉视频污| 亚洲一区二区在线视频| 日韩欧美一区二区在线视频| 久久se这里有精品| 中文字幕日韩一区| 欧美精品 国产精品| 日韩1区2区3区| 久久久.com| 欧美特级限制片免费在线观看| 久久精品国产精品亚洲精品| 久久精品夜色噜噜亚洲aⅴ| 91视频国产观看| 国产成人在线观看免费网站| 成人午夜看片网址| 成人免费观看av| 亚洲一区免费在线观看| 国产精品你懂的在线欣赏| 欧美日韩在线综合| 91蜜桃网址入口| 国产精品69毛片高清亚洲| 麻豆中文一区二区| 久久激情五月激情| 久久99在线观看| 国内不卡的二区三区中文字幕| 免费人成在线不卡| 九九九久久久精品| 日韩欧美国产一区二区三区| 亚洲国产日韩a在线播放| 日韩精品在线看片z| 欧洲一区二区三区在线| 国产一本一道久久香蕉| 国产精品午夜在线观看| 欧美tickle裸体挠脚心vk| 欧美一区二区黄| 亚洲乱码中文字幕| 欧美精品三级日韩久久| 91麻豆国产在线观看| 一区二区三区成人| 亚洲成人动漫在线观看|