2010-07-05 7 views
13

Ich weiß, wie die Spalten aus einer Tabelle erhalten Sie die folgende SQL-Anweisung:SQL - wie der einzigartigen Keys Spaltennamen aus der Tabelle erhalten

SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE (TABLE_NAME = 'MYTABLENAME') 

Aber wie komme ich genau das, was der Spaltennamen des UNIQUE Keys ?

+0

dies ist in hohem Maße abhängig von der Datenbank, die Sie verwenden. Welche Datenbank verwendest du? –

+0

@Xavier - solange es keine eingebettete DB ist, unterstützen die meisten jetzt das ANSI 'information_schema' – Donnie

+1

Es ist auch vollkommen akzeptabel, mehr als einen eindeutigen Schlüssel auf einer Tabelle zu haben ... Ich nehme an, du meinst Primärschlüssel, obwohl das kann eine Zusammensetzung aus mehreren Spalten sein –

Antwort

7

Etwas Ähnliches könnte (ungetestet) arbeiten:

SELECT * 
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC 
WHERE TC.TABLE_NAME = 'MYTABLENAME' 
AND TC.CONSTRAINT_TYPE = 'UNIQUE' 
+0

Dies ruft den Spaltennamen nicht wie angefordert ab. –

+0

Sorry, nicht auf meinem Rechner. Aber es ist, wo ich anfangen soll. :) – ongle

11
select CCU.CONSTRAINT_NAME, CCU.COLUMN_NAME 
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS as TC 
inner join INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE as CCU 
    on TC.CONSTRAINT_CATALOG = CCU.CONSTRAINT_CATALOG 
    and TC.CONSTRAINT_SCHEMA = CCU.CONSTRAINT_SCHEMA 
    and TC.CONSTRAINT_NAME = CCU.CONSTRAINT_NAME 
where TC.CONSTRAINT_CATALOG = 'MyCatalogName' 
and TC.CONSTRAINT_SCHEMA = 'MySchemaName' 
and TC.TABLE_NAME = 'MyTableName' 
and TC.CONSTRAINT_TYPE = 'UNIQUE' 

Beachten Sie, dass eine Tabelle mehrere eindeutige Einschränkungen aufweisen, die jeweils mit mehreren Spalten. Sie müssen einige zusätzliche Logik anwenden, um die richtige auszuwählen.

UPDATE - basierend auf anderen Kommentare ...

Die obige Abfrage alle UNIQUE Schlüsseleinschränkungen finden. Es werden jedoch PRIMARY KEY Constraints oder UNIQUE Indizes nicht gefunden, die außerhalb einer UNIQUE Schlüsselabhängigkeit erstellt wurden.

Um den Primärschlüssel, ersetzen Sie die letzte Zeile mit zu finden:

and TC.CONSTRAINT_TYPE = 'PRIMARY KEY' 
0

Würde nicht DESCRIBE TABLE_NAME; Mache den Trick?

+0

Hängt von der Datenbank ab. – Donnie

3

Etwas wie folgt aus:

Select col.name From 
sys.objects obj 
Join sys.columns col on col.[object_id] = obj.[object_id] 
Join sys.index_columns idx_cols on idx_cols.[column_id] = col.[column_id] and idx_cols.[object_id] = col.[object_id] 
Join sys.indexes idx on idx_cols.[index_id] = idx.[index_id] and idx.[object_id] = col.[object_id] 
where obj.name = 'MYTABLENAME' 
and idx.is_unique = 1 
1

Die beiden, die ich Arbeit gefunden sind die folgenden, war das 2. ein von der Original-Poster, aber ohne die TC.CONSTRAINT_TYPE = ‚UNIQUE‘. Diese Bedingung funktionierte nicht

SELECT  col.name 
FROM   sys.objects AS obj INNER JOIN 
         sys.columns AS col ON col.object_id = obj.object_id INNER JOIN 
         sys.index_columns AS idx_cols ON idx_cols.column_id = col.column_id AND idx_cols.object_id = col.object_id INNER JOIN 
         sys.indexes AS idx ON idx_cols.index_id = idx.index_id AND idx.object_id = col.object_id 
WHERE  (obj.name = 'pluginUsers') AND (idx.is_unique = 1) 

und auch

SELECT  CCU.CONSTRAINT_NAME, CCU.COLUMN_NAME 
FROM   INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC INNER JOIN 
         INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS CCU ON TC.CONSTRAINT_CATALOG = CCU.CONSTRAINT_CATALOG AND 
         TC.CONSTRAINT_SCHEMA = CCU.CONSTRAINT_SCHEMA AND TC.CONSTRAINT_NAME = CCU.CONSTRAINT_NAME 
WHERE  (TC.TABLE_NAME = 'pluginUsers') 

Vielen Dank für Ihre Beiträge

-1
SELECT * 
FROM mbiis.INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
WHERE TABLE_NAME='TABLE_NAME' AND CONSTRAINT_TYPE='UNIQUE'; 
Verwandte Themen