2010-07-05 19 views
13

So come ottenere le colonne di una tabella utilizzando la seguente istruzione SQL:SQL - Come ottenere Colonna nome della chiave univoca dalla tabella

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

Ma come faccio appena ritorno che nome colonna della chiave univoca ?

+0

questo è altamente dipendente del database utilizzato. Quale database usi? –

+0

@Xavier - purché non sia un DB incorporato, la maggior parte ora supporta ANSI 'information_schema' – Donnie

+1

È anche perfettamente accettabile avere più di una chiave unica su una tabella ... Presumo che tu intenda la chiave primaria, anche se può essere un composto di più colonne –

risposta

7

Qualcosa di simile potrebbe funzionare (non testata):

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

Questo non recupera il nome della colonna come richiesto. –

+0

Siamo spiacenti, non sulla mia macchina di sviluppo. Ma è da dove cominciare. :) – 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' 

Tenete a mente che una tabella può avere più vincoli univoci, ognuna delle quali contiene più colonne. Sarà necessario applicare qualche logica aggiuntiva per selezionare quella giusta.

UPDATE - sulla base di altri commenti ...

La query sopra troverà tutti UNIQUE vincoli di chiave. Tuttavia, non troverà i vincoli PRIMARY KEY o gli indici UNIQUE creati all'esterno di un vincolo di chiave UNIQUE.

Per trovare la chiave primaria, sostituire l'ultima riga con:

and TC.CONSTRAINT_TYPE = 'PRIMARY KEY' 
0

non descriverei TABLE_NAME; fare il trucco?

+0

Dipende dal database. – Donnie

3

Qualcosa di simile a questo:

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

I due che ho trovato al lavoro sono i seguenti, il 2 ° era dal poster originale, ma senza il TC.CONSTRAINT_TYPE = 'unico'. Tale condizione non funzionava

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) 

e anche

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

Grazie a tutti per i vostri messaggi

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