校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

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

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

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

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

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來進行相應的查詢

補充: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來進行相應的查詢。

添加約束

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)表等應用,可以與一些整型數(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)表,但又刪得不對,就會導致異常,比如上面這個例子會出現(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.手工恢復該表的約束對象,比較難也比較煩

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)絡通訊聲明:本文標題《PostgreSQL 查看表的主外鍵等約束關(guān)系詳解》,本文關(guān)鍵詞  PostgreSQL,查,看表,的,主外,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PostgreSQL 查看表的主外鍵等約束關(guān)系詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于PostgreSQL 查看表的主外鍵等約束關(guān)系詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    91精品免费在线观看| 日韩欧美成人激情| 欧美亚男人的天堂| 2020国产精品久久精品美国| 中文无字幕一区二区三区| 亚洲午夜免费电影| 成人午夜av影视| 日韩欧美国产综合| 亚洲一二三区不卡| 91在线porny国产在线看| 日韩一区二区在线免费观看| 亚洲久草在线视频| 福利91精品一区二区三区| 欧美一区欧美二区| 亚洲成精国产精品女| 国产精品99久久久久久久vr | 日韩一二在线观看| 一区二区三区资源| 日本精品一级二级| 亚洲人xxxx| 99久久免费精品| 国产偷国产偷亚洲高清人白洁 | 国内成+人亚洲+欧美+综合在线| 欧美中文一区二区三区| 亚洲欧美二区三区| 色婷婷久久久综合中文字幕| 国产精品伦理一区二区| 成人视屏免费看| 国产精品女同一区二区三区| 国产激情视频一区二区三区欧美| 欧美精品一区二区三区蜜桃 | 精品国产三级a在线观看| 日韩高清欧美激情| 91精品欧美一区二区三区综合在 | 欧美一区二区啪啪| 一区二区激情小说| 国产一区二区三区四| 欧美欧美欧美欧美| 亚洲日本护士毛茸茸| 国产精品一区在线| 精品久久久久99| 亚洲女同一区二区| 91成人网在线| 国产精品视频一区二区三区不卡| 狠狠狠色丁香婷婷综合激情| 中文幕一区二区三区久久蜜桃| 国产女人水真多18毛片18精品视频| 美女在线一区二区| 欧美一区二区成人| 男男成人高潮片免费网站| 欧美日韩在线观看一区二区 | 久久精品视频网| 久久机这里只有精品| 8x8x8国产精品| 国产最新精品精品你懂的| 欧美亚洲免费在线一区| 亚洲与欧洲av电影| 欧美午夜电影在线播放| 亚洲国产三级在线| 制服丝袜亚洲色图| 99国产精品久久久久久久久久| 国产真实精品久久二三区| 精品国产成人在线影院 | 亚洲高清免费观看高清完整版在线观看| 欧美精品一二三四| 亚洲狠狠丁香婷婷综合久久久| 色噜噜久久综合| 亚洲国产精品欧美一二99| 在线综合视频播放| 精品在线一区二区三区| 中文字幕第一区| 色狠狠色噜噜噜综合网| 国产精品动漫网站| 色94色欧美sute亚洲线路一ni| 亚洲女同一区二区| 日韩欧美在线影院| 国产电影一区二区三区| 亚洲三级电影网站| 日韩一级高清毛片| 国产成人免费在线观看| 亚洲影院在线观看| 欧美电影免费观看高清完整版| 高清在线成人网| 亚洲精品一二三四区| 欧美浪妇xxxx高跟鞋交| 精品亚洲porn| 综合久久久久综合| 精品久久五月天| 色综合天天综合色综合av| 亚洲视频 欧洲视频| 精品理论电影在线观看| 91国产视频在线观看| 激情综合色播五月| 夜夜嗨av一区二区三区中文字幕| 91美女精品福利| 国产精品一二三四区| 亚洲一区二三区| 欧美激情在线看| 91精品国产综合久久蜜臀| www.亚洲色图.com| 奇米精品一区二区三区四区| 中文字幕永久在线不卡| 欧美mv日韩mv| 欧美自拍偷拍一区| 成人av电影免费在线播放| 日本不卡123| 亚洲乱码中文字幕| 久久色成人在线| 911精品国产一区二区在线| 成人黄色777网| 韩国v欧美v日本v亚洲v| 日韩高清一区在线| 亚洲午夜免费电影| 亚洲欧美韩国综合色| 国产精品嫩草影院av蜜臀| 欧美成人艳星乳罩| 69堂精品视频| 不卡一卡二卡三乱码免费网站| 国产美女一区二区三区| 免费在线欧美视频| 首页国产丝袜综合| 亚洲最大成人综合| 国产精品久久久久久久久免费樱桃 | 国产麻豆午夜三级精品| 麻豆精品一区二区三区| 视频一区在线播放| 亚洲一区二区欧美| 亚洲在线视频网站| 亚洲国产日韩综合久久精品| 亚洲综合在线五月| 一区二区在线观看视频| 亚洲在线观看免费视频| 亚洲不卡av一区二区三区| 亚洲一级在线观看| 一区二区不卡在线视频 午夜欧美不卡在 | 欧美老女人在线| 欧美高清视频一二三区| 欧美久久婷婷综合色| 91精品啪在线观看国产60岁| 91精品国模一区二区三区| 欧美高清你懂得| www久久精品| 中文字幕精品综合| 亚洲日本在线天堂| 日韩理论片中文av| 亚洲精品视频免费看| 一区二区日韩电影| 肉丝袜脚交视频一区二区| 日本午夜精品一区二区三区电影| 激情六月婷婷久久| 国产成都精品91一区二区三| 成人h动漫精品| 欧美在线观看一二区| 538在线一区二区精品国产| 日韩一区二区三区电影在线观看| 欧美成人乱码一区二区三区| 国产精品蜜臀av| 中文字幕一区av| 青青草成人在线观看| 国产成人精品免费在线| 色婷婷综合久久| 91精品国产91综合久久蜜臀| 久久久久久电影| 亚洲在线观看免费视频| 久久国产综合精品| 91亚洲国产成人精品一区二三| 欧美日韩成人在线| 精品免费日韩av| 久久男人中文字幕资源站| 亚洲免费伊人电影| 久草中文综合在线| 91麻豆视频网站| 日韩三级在线观看| 国产精品国产三级国产aⅴ原创| 亚洲五月六月丁香激情| 国产又黄又大久久| 欧洲生活片亚洲生活在线观看| 欧美性受xxxx| 国产精品久久久久久久久快鸭| 亚洲成人动漫av| 床上的激情91.| 日韩一区二区中文字幕| 亚洲欧美日韩国产综合| 久久99国产精品久久99果冻传媒| 91久久国产最好的精华液| xf在线a精品一区二区视频网站| 国产精品麻豆视频| 日韩中文欧美在线| 欧美日韩久久久一区| 国产精品久久久久久久久果冻传媒| 午夜私人影院久久久久| av不卡一区二区三区| www国产精品av| 视频一区二区欧美| 色吊一区二区三区| 国产精品久久三| 国内精品久久久久影院色| 日本道色综合久久| 亚洲欧洲中文日韩久久av乱码| 国产a区久久久|