1. 程式人生 > >主鍵查詢和設定(postgres )

主鍵查詢和設定(postgres )

今天庫裡需要建一張新表,需要三個欄位聯合作為主鍵。在Navicat裡是可以通過點選最後一欄設定主鍵的。
這裡寫圖片描述
但是我心想,一張表只有一個主鍵,這個1,2,3表示的是啥啊?心裡有點擔心的自己的主鍵有沒有設定成功,就查了一下本張表的主鍵是什麼。
下面這個sql語句可以顯示主鍵的名字:

SELECT
    pg_constraint.conname AS pk_name
FROM
    pg_constraint
INNER JOIN pg_class ON pg_constraint.conrelid = pg_class.oid
WHERE
    pg_class.relname = 'YOUR_TABLE_NAME'
AND pg_constraint.contype = 'p'

結果是這樣的
這裡寫圖片描述
顯示了這個主鍵的名字。
我心說這有啥用啊,我想知道的是這個主鍵包含的欄位。於是就有了下面的這個:

SELECT
    pg_constraint.conname AS pk_name,
    pg_attribute.attname AS colname,
    pg_type.typname AS typename
FROM
    pg_constraint
INNER JOIN pg_class ON pg_constraint.conrelid = pg_class.oid
INNER JOIN
pg_attribute ON pg_attribute.attrelid = pg_class.oid AND pg_attribute.attnum = pg_constraint.conkey [ 1 ] INNER JOIN pg_type ON pg_type.oid = pg_attribute.atttypid WHERE pg_class.relname = 'YOUR_TABLE_NAME' AND pg_constraint.contype = 'p'

就得到了一個鍵值
這裡寫圖片描述
通過設定sql語句裡的數字為1,2,3就得到了我的這三個鍵確實是設定為了主鍵。
然後我就寫了以他三為鍵值的測試,發現確實沒錯。
我竟然花了一個小時去驗證這個Navicat的新增鍵值是不是正確?
只好稍微梳理一下這幾張表

這裡寫圖片描述

pg_constraint 該系統表儲存PostgreSQL中表物件的檢查約束、主鍵、唯一約束和外來鍵約束。
pg_attribute該系統表儲存所有表(包括系統表,如pg_class)的欄位資訊。資料庫中的每個表的每個欄位在pg_attribute表中都有一行記錄。
pg_type該系統表儲存有關資料型別的資訊。
pg_class該系統表記錄了資料表、索引(仍然需要參閱pg_index)、序列、檢視、複合型別和一些特殊關係型別的元資料
pg_constraint.conname  (約束名字)
pg_constraint.conrelid  (該約束所在的表,如果不是表約束則為0)
pg_constraint.conkey (如果是表約束,則是約束控制的欄位列表)
pg_constraint.contypec  ( 檢查約束, f = 外來鍵約束, p = 主鍵約束, u = 唯一約束)
pg_constraint.conkey  (如果是表約束(包含外來鍵,但是不包含約束觸發器),則是約束欄位的列表)
pg_attribute.attname (欄位名)
pg_attribute.attrelid   (此欄位所屬的表)
pg_attribute.atttypid   (欄位的資料型別)
pg_attribute.attnum (欄位數目。普通欄位是從 1 開始計數的。系統欄位 (比如oid)有(任意)負數)
pg_type.typname (資料型別名字)
pg_type.oid (行識別符號(隱藏屬性;必須明確選擇))
pg_class.relname (資料型別名字)
pg_class.oid (行識別符號(隱藏屬性; 必須明確選擇))