查詢SQL Server中Table是否有Primary Key

資料庫中的 table, 大家都知道 primary key對 table的效能影響很大, 沒有主鍵的 table, 對於一般在程式實作時會有一定的困難, (某些狀況下例外, 例如 log), 尤其是在更新列時, 沒有 primary key時的時候, 效能根本是很糟糕的, 更危險的是可能會有資料本身邏輯上的問題. 今天我們不是來探討 primary key 的重要性, 而是找出資料庫中, 沒有 primary key 的 table.

其實很簡單地可以利用 sysobjects 這個系統表來查詢, 簡單描述如下, 我們利用 sysobjects 對自已對照, 並利用 parent_obj 這個欄位來串接起來自已對應自己的查詢, sysobjects 內有 table, view, primary key (index), 等資訊, 而我們就利用這樣的方式來進行查詢, 整理好的查詢如下:

select a.name as tablename, b.name as pkname from sysobjects a left join sysobjects b on b.parent_obj = a.id and b.xtype='PK' and b.type='K' where a.xtype='U' and a.type='U'
order by a.name

其中 a 是查 table 用的, 所以 a.xtype=’U’ 及 a.type=’U’ 是找出 table 的條件, 而 b 是用來對照 a 用的查找 primary key 用的, 所以對應條件為 b.parent_obj = a.id 用來找出屬於 a 的子物件, 所以再加上 b.xtype=’PK’ 及 b.type=’K’ 代表找出 b 是 primary key, 如此一來便能查找出所有 table 對應的 primary key, 由於是使用 left join 的方式, 若是沒有 primary key 的 table, 則會找出 null (沒有對應到), 結果範例如下:

這是用 SQL 2000 的 Northwind 資料庫查找出來的結果. 相信對於 dba 在調整資料庫時, 會是非常方便的一道查詢, 給大家參考!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。