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