2011-05-24 113 views
7

這是最好的方式 - 獲取數據庫中所有主鍵的列表 - 還是有更好的辦法?獲取數據庫中所有主鍵的列表

SELECT 
KCU.TABLE_NAME AS Table_Name, 
KCU.CONSTRAINT_NAME AS Constraint_Name, 
KCU.COLUMN_NAME AS COLUMN_NAME 
FROM 
INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC 
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU 
ON KCU.CONSTRAINT_SCHEMA = TC.CONSTRAINT_SCHEMA 
AND KCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME 
AND KCU.TABLE_SCHEMA = TC.TABLE_SCHEMA 
AND KCU.TABLE_NAME = TC.TABLE_NAME 
WHERE 
TC.CONSTRAINT_TYPE = 'PRIMARY KEY' 
ORDER BY 
KCU.TABLE_SCHEMA, KCU.TABLE_NAME, KCU.CONSTRAINT_NAME 
+2

請選擇一個更好的標題。還有什麼你的意思是「最好的」? – 2011-05-24 10:00:35

+0

你也許也可以使用@@身份,但我不知道,如果這是你的意思? – Ruben 2011-05-24 10:02:52

+0

@cularis - RE:您建議的標籤編輯「INFORMATION_SCHEMA」絕對不意味着「MySQL」。這些意味着便攜式的意見。 – 2011-05-24 10:05:00

回答

4

外觀上link

EXEC sp_pkeys '<tablename>' 
EXEC sp_helpconstraint '<tablename>' 

sp_pkeys將返回,在爲 主鍵參與的每個 列一行。您可能最感興趣的 列是COLUMN_NAME和PK_NAME。

sp_helpconstraint將列出所有 約束條件,包括 引用該表的外鍵。 在第一個記錄集中,將有 只是一個名爲對象名稱 (無用的類型,因爲這是你通過的 )。在第二個 結果集中,將有以下 列:constraint_type, constraint_name和constraint_keys。

+5

這是爲什麼的答案,它只做它不是數據庫,這是問題的原始點 – 2016-10-05 15:11:17

+1

此處引用的鏈接無效 – mjenkins 2017-05-19 16:29:26

29
USE databasename; 

GO 

SELECT i.name AS IndexName, OBJECT_NAME(ic.OBJECT_ID) AS TableName, 
     COL_NAME(ic.OBJECT_ID,ic.column_id) AS ColumnName 
FROM sys.indexes AS i 
INNER JOIN sys.index_columns AS ic 
ON i.OBJECT_ID = ic.OBJECT_ID 
AND i.index_id = ic.index_id 
WHERE i.is_primary_key = 1 

這個查詢從數據庫中提取的所有主鍵約束... ü只需要執行這個查詢,並在第一線

0

鍵入數據庫名稱如果從這樣做java也可以在databasemetadata對象中使用getPrimaryKeys方法。也許其他語言有類似的方式來做到這一點。

6

以下語法爲您提供了在使用的數據庫中的所有約束。

select * from sys.key_constraints; 
+3

要添加到來自@Ashraf的響應,您可以使用'select OBJECT_NAME(parent_object_id),* from sys.key_constraints where type ='PK'。這將爲您提供具有主鍵的表的表名和主鍵名。 – nam 2015-10-26 16:22:47

1

如果你想要的數據類型信息以及:

SELECT 
    so.name 'Table Name', 
    c.name 'Column Name', 
    t.Name 'Data type', 
    c.max_length 'Max Length', 
    c.precision , 
    c.scale , 
    c.is_nullable, 
    ISNULL(i.is_primary_key, 0) 'Primary Key' 
FROM  
    sys.columns c 
INNER JOIN 
    sys.types t ON c.user_type_id = t.user_type_id 
LEFT OUTER JOIN 
    sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id 
LEFT OUTER JOIN 
    sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id 
INNER JOIN 
    sysobjects so ON c.object_id = so.id 
WHERE 
    i.is_primary_key = 1 and 
    so.xtype = 'U' 
Order By 'Table Name', 'Column Name' 
相關問題