1. 程式人生 > >MS SQL SERVER搜索某個表的主鍵所在的列名

MS SQL SERVER搜索某個表的主鍵所在的列名

視圖 尋找 屬性 serve 多個 數據庫管理 ble 觸發器 .com

原文:MS SQL SERVER搜索某個表的主鍵所在的列名

SELECT SYSCOLUMNS.name
FROM SYSCOLUMNS,SYSOBJECTS,SYSINDEXES,SYSINDEXKEYS
WHERE SYSCOLUMNS.id = object_id(‘Tab_XXX‘) --syscolumns.id為該列所屬的表對象ID
AND SYSOBJECTS.xtype = ‘PK‘ --sysobjects.xtype對象類型
AND SYSOBJECTS.parent_obj = SYSCOLUMNS.id
AND SYSINDEXES.id = SYSCOLUMNS

.id
AND SYSOBJECTS.name = SYSINDEXES.name
AND SYSINDEXKEYS.id = SYSCOLUMNS.id
AND SYSINDEXKEYS.indid = SYSINDEXES.indid --同一表的同一列,可能建有不同類型的索引
AND SYSCOLUMNS.colid = SYSINDEXKEYS.colid

註意:這是在4張系統表中尋找的,關系比較復雜,大致可以表示為:
  SYSCOLUMNS中存有表中的列colid和表id,sysobjects表中存有主鍵名字(即PK_Table類似)和表id,sysindexes中存 有主鍵名字和表id和index編號,sysindexkeys中存有表id和index編號和列編號,一項一項對應起來後就能找到列名了。

SELECT * FROM SYSCOLUMNS
--SYSCOLUMNS每個表和視圖中的每列在表中占一行,存儲過程中的每個參數在表中也占一行。
--syscolumns.id為該列所屬的表對象ID
--syscolumns.colid為該列對象ID

SELECT * FROM SYSOBJECTS
--SYSOBJECTS在數據庫內創建的每個對象(約束、默認值、日誌、規則、存儲過程、表、視圖、等)在表中占一行。
--sysobjects.xtype對象類型
--sysobjects.parent_obj父對象的對象標識號(例如,對於觸發器或約束,該標識號為表id)
--sysobjects.name對象名稱,這裏為主鍵名字(即PK_Table類似)


SELECT * FROM SYSINDEXES
--數據庫中的每個索引和表在表中各占一行。
--sysindexes.id 表ID(如果 indid = 0 或 255)。否則為索引所屬表id。
--sysindexes.name 表名(如果 indid = 0 或 255)。否則為索引的名稱。這裏為有主鍵名字(主鍵必為索引,見下述分析)
--sysindexes.indid 索引ID的類型

SELECT * FROM SYSINDEXKEYS
--數據庫中的每個索引和表在表中各占一行。
--sysindexkeys.id 表ID
--sysindexkeys.indid 索引ID的類型
--sysindexkeys.colid 列ID

主鍵一定是唯一性索引,唯一性索引並不一定就是主鍵

所謂主鍵就是能夠唯一標識表中某一行的屬性或屬性組,一個表只能有一個主鍵,但可以有多個候選索引。因為主鍵可以唯一標識某一行記錄,所以可以確保執行數據更新、刪除的時候不會出現張冠李戴的錯誤。主鍵除了上述作用外,常常與外鍵構成參照完整性約束,防止出現數據不一致。數據庫在設計時,主鍵起到了很重要的作用。

主鍵可以保證記錄的唯一和主鍵域非空,數據庫管理系統對於主鍵自動生成唯一索引,所以主鍵也是一個特殊的索引。

MS SQL SERVER搜索某個表的主鍵所在的列名