2010-07-05 4 views
13

Je sais comment obtenir les colonnes d'une table en utilisant l'instruction SQL suivante:SQL - Comment obtenir le nom de l'unique clé de la colonne du tableau

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

Mais comment puis-je reviens tout ce que le nom de la colonne de la clé UNIQUE ?

+0

cela dépend fortement de la base de données que vous utilisez. Quelle base de données utilisez-vous? –

+0

@Xavier - tant que ce n'est pas une base de données embarquée, la plupart supportent maintenant la norme ANSI 'information_schema' – Donnie

+1

Il est également parfaitement acceptable d'avoir plus d'une clé unique sur une table ... Je suppose que vous voulez dire clé primaire, bien que peut être un composite de plusieurs colonnes –

Répondre

7

Quelque chose comme cela pourrait fonctionner (non testé):

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

Cela ne récupère pas le nom de la colonne comme demandé. –

+0

Désolé, pas sur ma machine de dev. Mais c'est par où commencer. :) – 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' 

Gardez à l'esprit qu'une table peut avoir de multiples contraintes uniques, chacune contenant plusieurs colonnes. Vous devrez appliquer une logique supplémentaire pour sélectionner la bonne.

MISE À JOUR - basé sur d'autres commentaires ...

La requête ci-dessus trouverez toutes les principales contraintes UNIQUE. Toutefois, il ne trouvera pas les contraintes PRIMARY KEY ou les index UNIQUE créés en dehors d'une contrainte de clé UNIQUE.

Pour trouver la clé primaire, remplacer la dernière ligne avec:

and TC.CONSTRAINT_TYPE = 'PRIMARY KEY' 
0

ne qualifierai pas TABLE_NAME; faire l'affaire?

+0

Dépend de la base de données. – Donnie

3

Quelque chose comme ceci:

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

Les deux que je trouvais au travail sont les suivantes, le 2e était de l'affiche originale mais sans TC.CONSTRAINT_TYPE = « UNIQUE ». Cette condition ne fonctionnait pas

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) 

et aussi

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') 

Merci à tous pour vos messages

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