天天看點

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

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

    所謂主鍵就是能夠唯一辨別表中某一行的屬性或屬性組,一個表隻能有一個主鍵,但可以有多個候選索引。因為主鍵可以唯一辨別某一行記錄,是以可以確定執行資料更新、删除的時候不會出現張冠李戴的錯誤。主鍵除了上述作用外,常常與外鍵構成參照完整性限制,防止出現資料不一緻。資料庫在設計時,主鍵起到了很重要的作用。

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