2010-10-14 41 views
97

संभव डुप्लिकेट का उपयोग कर तालिका प्राथमिक कुंजी प्राप्त करें:
How do you list the primary key of a SQL Server table?एसक्यूएल सर्वर: एसक्यूएल क्वेरी

मैं एसक्यूएल सर्वर डेटाबेस के लिए SQL क्वेरी का उपयोग कर एक विशेष तालिका के प्राथमिक कुंजी प्राप्त करना चाहते हैं।

में MySQL मैं निम्न क्वेरी का उपयोग कर रहा तालिका प्राथमिक कुंजी प्राप्त करने के लिए:

SHOW KEYS FROM tablename WHERE Key_name = 'PRIMARY' 

क्या एसक्यूएल सर्वर के लिए ऊपर क्वेरी के बराबर है?।

तो एक प्रश्न है कि दोनों MySQL और एसक्यूएल सर्वर के लिए काम करेंगे तो यह एक आदर्श मामले हो जाएगा नहीं है।

+1

करते समय सावधान रहें INFORMATION_SCHEMA.Views का उपयोग कर, क्योंकि वे मज़बूती से वापस नहीं लौट सकते CONSTRAINT_SCHEMA और TABLE_SCHEMA (देखें, उदाहरण के लिए: http://msdn.microsoft.com/en-us /library/ms181757.aspx) इस समस्या के बारे में चर्चा के लिए इस एमएसडीएन धागे को जांचें http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/732bd071-2c1f-4c23-9215-4ff3822c63c3 – Naomi

उत्तर

49

मिला एक और एक:

SELECT KU.table_name as TABLENAME,column_name as PRIMARYKEYCOLUMN 
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC 
INNER JOIN 
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KU 
      ON TC.CONSTRAINT_TYPE = 'PRIMARY KEY' AND 
      TC.CONSTRAINT_NAME = KU.CONSTRAINT_NAME AND 
      KU.table_name='yourTableName' 
ORDER BY KU.TABLE_NAME, KU.ORDINAL_POSITION; 

मैं एसक्यूएल सर्वर पर इस परीक्षण किया है 2003/2005

+4

इस बारे में क्या महत्वपूर्ण है यह आपको क्रमशः पीके फ़ील्ड ** देता है **। कभी-कभी यह मायने रखता है! – Kip

+0

एक और संस्करण जो उन्हें अल्पविराम से अलग सूची में क्रम में रखता है, यहां है: http://stackoverflow.com/a/42985271/1339704 – Soenhay

+0

'info_schema' का उपयोग करके (' sys के विपरीत।'विचार) हमेशा एक अच्छा विचार है क्योंकि यह आधिकारिक मानक है और इसे कुछ अन्य डेटाबेस सिस्टम में लागू किया गया है। – Jakub

9

स्मृति से, यह या तो इस

SELECT * FROM sys.objects 
WHERE type = 'PK' 
AND object_id = OBJECT_ID ('tableName') 

या इस है ..

SELECT * FROM sys.objects 
WHERE type = 'PK' 
AND parent_object_id = OBJECT_ID ('tableName') 

मुझे लगता है कि उनमें से एक शायद कैसे डेटा संग्रहीत किया जाता है के आधार पर काम करना चाहिए लेकिन मुझे डर है मैं कर रहा हूँ असल में इसे सत्यापित करने के लिए एसक्यूएल तक कोई पहुंच नहीं है।

47

SQL सर्वर 2005 का उपयोग करना, क्या आप काम करता है और न पुन: प्राप्त करता कोशिश कर सकते हैं

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 

SQL SERVER – 2005 – Find Tables With Primary Key Constraint in Database

+0

कहां उपरोक्त क्वेरी में मेरी वांछित तालिका का नाम (प्राथमिक कुंजी आवश्यक) रखेगा? – Awan

+0

बहुत अच्छा क्योंकि यह उन्हें ए-जेड –

+0

के बजाय अवसर के क्रम में प्रदर्शित करता है यह क्वेरी मेरे छोटे और खाली डेटाबेस पर सबसे ऊपर दिए गए उत्तर से बहुत तेज़ी से चलती है। – Gobe

4
select * 
from sysobjects 
where xtype='pk' and 
    parent_obj in (select id from sysobjects where name='tablename') 

पर मिले इस एसक्यूएल 2005

+0

यदि आप कोड या एक्सएमएल पोस्ट करते हैं, ** कृपया ** टेक्स्ट एडिटर में उन पंक्तियों को हाइलाइट करें और संपादक टूलबार पर "कोड" बटन (101 010) पर क्लिक करें ताकि इसे अच्छी तरह प्रारूपित किया जा सके और इसे हाइलाइट किया जा सके! –

+1

इसके अलावा, SQL सर्वर 2005 और बाद में, 'sys' कैटलॉग दृश्यों का उपयोग करने और विरासत 'sysobjects' तालिका का उपयोग बंद करने की अनुशंसा की जाती है। तो अपने मामले में, 'sys.tables' और' sys.columns' और अन्य sys कैटलॉग दृश्यों का उपयोग करें। –

3

कोड में काम करेंगे मैं दे देंगे केवल कुंजी, लेकिन SQL सर्वर में एक तालिका से बहुत सारे डेटा। SQL सर्वर 2k5/2k8 में परीक्षण किया गया है, लगभग 2k dunno। का आनंद लें!

SELECT DISTINCT 
    sys.tables.object_id AS TableId, 
    sys.columns.column_id AS ColumnId, 
    sys.columns.name AS ColumnName, 
    sys.types.name AS TypeName, 
    sys.columns.precision AS NumericPrecision, 
    sys.columns.scale AS NumericScale, 
    sys.columns.is_nullable AS IsNullable, 
    ( SELECT 
      COUNT(column_name) 
     FROM 
      INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE 
     WHERE 
      TABLE_NAME = sys.tables.name AND 
      CONSTRAINT_NAME = 
       ( SELECT 
        constraint_name 
        FROM 
         INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
        WHERE 
         TABLE_NAME = sys.tables.name AND      
         constraint_type = 'PRIMARY KEY' AND 
         COLUMN_NAME = sys.columns.name 
       ) 
    ) AS IsPrimaryKey, 
    sys.columns.max_length/2 AS CharMaxLength /*BUG*/ 
FROM 
    sys.columns, sys.types, sys.tables 
WHERE 
    sys.tables.object_id = sys.columns.object_id AND 
    sys.types.system_type_id = sys.columns.system_type_id AND 
    sys.types.user_type_id = sys.columns.user_type_id AND 
    sys.tables.name = 'TABLE' 
ORDER BY 
    IsPrimaryKey 

आप केवल प्राथमिक कुंजी भाग का उपयोग कर सकते हैं, लेकिन मुझे लगता है कि बाकी आसान हो सकते हैं। सादर, डेविड

123

मैं भी एसक्यूएल सर्वर के लिए एक दूसरे से मिले:

SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_SCHEMA + '.' + QUOTENAME(CONSTRAINT_NAME)), 'IsPrimaryKey') = 1 
AND TABLE_NAME = 'TableName' AND TABLE_SCHEMA = 'Schema' 
+0

यह SQL Server 2005 पर नहीं चल रहा है। मैंने एक और उत्तर जोड़ा जो SQL Server 2003 और SQL Server 2005 दोनों के लिए उपयोगी है। – Awan

+2

पता नहीं क्यों, लेकिन OBJECTPROPERTY (OBJECT_ID (constraint_name), 'IsPrimaryKey') मेरे में NULL देता है मामला। नीचे समाधान ठीक काम करता है। शायद आपका समाधान जटिल पीके (2 और अधिक कॉलम) के लिए काम नहीं करता है। – nZeus

+3

यदि आप एक ही मुद्दे से पीड़ित हैं, तो ऑब्जेक्ट प्रॉपर्टी फ़ंक्शन शून्य लौट रहा है क्योंकि ऑब्जेक्ट आईडी फ़ंक्शन शून्य पर वापस आ जाएगा यदि बाध्य स्कीमा में ऑब्जेक्ट से बाध्यता संलग्न नहीं है। आपको ऑब्जेक्ट आईडी फ़ंक्शन के अंदर बाधा नाम के लिए बाधा स्कीमा को जोड़ना होगा। मनाइए कि यह किसी और के लिए सहायक हो। – jwhaley58

1

यह भी है (Transact-SQL) ... बोल के अनुसार।

-- exec sp_serveroption 'SERVER NAME', 'data access', 'true' --execute once 

EXEC sp_primarykeys @table_server = N'server_name', 
    @table_name = N'table_name', 
    @table_catalog = N'db_name', 
    @table_schema = N'schema_name'; --frequently 'dbo' 
4

यह सभी बाधाओं में सूचीबद्ध करना चाहिए और अंत में आप अपने फिल्टर डाल सकते हैं

/* CAST IS DONE , SO THAT OUTPUT INTEXT FILE REMAINS WITH SCREEN LIMIT*/ 
WITH ALL_KEYS_IN_TABLE (CONSTRAINT_NAME,CONSTRAINT_TYPE,PARENT_TABLE_NAME,PARENT_COL_NAME,PARENT_COL_NAME_DATA_TYPE,REFERENCE_TABLE_NAME,REFERENCE_COL_NAME) 
AS 
(
SELECT CONSTRAINT_NAME= CAST (PKnUKEY.name AS VARCHAR(30)) , 
     CONSTRAINT_TYPE=CAST (PKnUKEY.type_desc AS VARCHAR(30)) , 
     PARENT_TABLE_NAME=CAST (PKnUTable.name AS VARCHAR(30)) , 
     PARENT_COL_NAME=CAST (PKnUKEYCol.name AS VARCHAR(30)) , 
     PARENT_COL_NAME_DATA_TYPE= oParentColDtl.DATA_TYPE,   
     REFERENCE_TABLE_NAME='' , 
     REFERENCE_COL_NAME='' 

FROM sys.key_constraints as PKnUKEY 
    INNER JOIN sys.tables as PKnUTable 
      ON PKnUTable.object_id = PKnUKEY.parent_object_id 
    INNER JOIN sys.index_columns as PKnUColIdx 
      ON PKnUColIdx.object_id = PKnUTable.object_id 
      AND PKnUColIdx.index_id = PKnUKEY.unique_index_id 
    INNER JOIN sys.columns as PKnUKEYCol 
      ON PKnUKEYCol.object_id = PKnUTable.object_id 
      AND PKnUKEYCol.column_id = PKnUColIdx.column_id 
    INNER JOIN INFORMATION_SCHEMA.COLUMNS oParentColDtl 
      ON oParentColDtl.TABLE_NAME=PKnUTable.name 
      AND oParentColDtl.COLUMN_NAME=PKnUKEYCol.name 
UNION ALL 
SELECT CONSTRAINT_NAME= CAST (oConstraint.name AS VARCHAR(30)) , 
     CONSTRAINT_TYPE='FK', 
     PARENT_TABLE_NAME=CAST (oParent.name AS VARCHAR(30)) , 
     PARENT_COL_NAME=CAST (oParentCol.name AS VARCHAR(30)) , 
     PARENT_COL_NAME_DATA_TYPE= oParentColDtl.DATA_TYPE,  
     REFERENCE_TABLE_NAME=CAST (oReference.name AS VARCHAR(30)) , 
     REFERENCE_COL_NAME=CAST (oReferenceCol.name AS VARCHAR(30)) 
FROM sys.foreign_key_columns FKC 
    INNER JOIN sys.sysobjects oConstraint 
      ON FKC.constraint_object_id=oConstraint.id 
    INNER JOIN sys.sysobjects oParent 
      ON FKC.parent_object_id=oParent.id 
    INNER JOIN sys.all_columns oParentCol 
      ON FKC.parent_object_id=oParentCol.object_id /* ID of the object to which this column belongs.*/ 
      AND FKC.parent_column_id=oParentCol.column_id/* ID of the column. Is unique within the object.Column IDs might not be sequential.*/ 
    INNER JOIN sys.sysobjects oReference 
      ON FKC.referenced_object_id=oReference.id 
    INNER JOIN INFORMATION_SCHEMA.COLUMNS oParentColDtl 
      ON oParentColDtl.TABLE_NAME=oParent.name 
      AND oParentColDtl.COLUMN_NAME=oParentCol.name 
    INNER JOIN sys.all_columns oReferenceCol 
      ON FKC.referenced_object_id=oReferenceCol.object_id /* ID of the object to which this column belongs.*/ 
      AND FKC.referenced_column_id=oReferenceCol.column_id/* ID of the column. Is unique within the object.Column IDs might not be sequential.*/ 

) 

select * from ALL_KEYS_IN_TABLE 
where 
    PARENT_TABLE_NAME in ('YOUR_TABLE_NAME') 
    or REFERENCE_TABLE_NAME in ('YOUR_TABLE_NAME') 
ORDER BY PARENT_TABLE_NAME,CONSTRAINT_NAME; 

संदर्भ के लिए कृपया पढ़ें - http://blogs.msdn.com/b/sqltips/archive/2005/09/16/469136.aspx

5
SELECT COLUMN_NAME FROM {DATABASENAME}.INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_NAME LIKE '{TABLENAME}' AND CONSTRAINT_NAME LIKE 'PK%' 

कहां
{DatabaseName} अपने डेटाबेस को अपने सर्वर से = और
{tablename} अपने तालिका नाम है जिसमें से आप प्राथमिक कुंजी देखना चाहता हूँ =।

नोट: ब्रैकेट के बिना अपना डेटाबेस नाम और तालिका नाम दर्ज करें।

2

ध्यान रखें कि आप हालत में TABLE_NAME और TABLE_SCHEMA लगाने की जरूरत है आप सटीक प्राथमिक क्षेत्र पाने के लिए चाहते हैं।

इस समाधान काम करना चाहिए:

select COLUMN_NAME from information_schema.KEY_COLUMN_USAGE 
where CONSTRAINT_NAME='PRIMARY' AND TABLE_NAME='TABLENAME' 
AND TABLE_SCHEMA='DATABASENAME' 
+1

CONSTRAINT_NAME हमेशा 'प्राथमिक' नहीं है – frostymarvelous

संबंधित मुद्दे