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
主鍵一定是唯一性索引,唯一性索引並不一定就是主鍵
所謂主鍵就是能夠唯一標識表中某一行的屬性或屬性群組,一個表只能有一個主鍵,但可以有多個候選索引。因為主鍵可以唯一標識某一行記錄,所以可以確保執行資料更新、刪除的時候不會出現張冠李戴的錯誤。主鍵除了上述作用外,常常與外鍵構成參照完整性條件約束,防止出現資料不一致。資料庫在設計時,主鍵起到了很重要的作用。
主鍵可以保證記錄的唯一和主鍵域非空,資料庫管理系統對於主鍵自動產生唯一索引,所以主鍵也是一個特殊的索引。