2010-07-05 2 views
13

Я знаю, как получить столбцы из таблицы, используя следующий SQL заявление:SQL - Как получить уникальный ключ в столбце Имя из таблицы

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

Но как же я просто вернуть то, что имя столбца уникального ключа в ?

+0

это сильно зависит от используемой базы данных. Какую базу данных вы используете? –

+0

@ Xavier - если это не встроенная БД, большинство из них теперь поддерживают ANSI 'information_schema' – Donnie

+1

Также вполне приемлемо иметь более одного уникального ключа на таблице ... Предполагаю, что вы имеете в виду первичный ключ, хотя это может быть составным из нескольких столбцов –

ответ

7

Что-то подобное может работать (непроверенные):

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

Это не возвращает имя столбца в соответствии с запросом. –

+0

Извините, не на моей машине dev. Но с чего начать. :) – 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' 

Имейте в виду, что таблица может иметь несколько уникальных ограничений, каждый из которых содержит несколько столбцов. Вам нужно будет применить некоторую дополнительную логику, чтобы выбрать правильный.

UPDATE - на основе других комментариев ...

Этот запрос будет найти все UNIQUE ключевые ограничения. Однако он не найдет ограничений PRIMARY KEY или UNIQUE, которые были созданы за пределами ограничения ключа UNIQUE.

Чтобы найти первичный ключ, замените последнюю строку с:

and TC.CONSTRAINT_TYPE = 'PRIMARY KEY' 
0

не опишет TABLE_NAME; Покажи фокус?

+0

Зависит от базы данных. – Donnie

3

Что-то вроде этого:

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

Два, что я нашел работу являются следующие, второй один был из оригинального плаката, но без TC.CONSTRAINT_TYPE = «UNIQUE». Это условие не работает

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) 

а также

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

Спасибо всем за ваши посты

-1
SELECT * 
FROM mbiis.INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
WHERE TABLE_NAME='TABLE_NAME' AND CONSTRAINT_TYPE='UNIQUE'; 
Смежные вопросы