Я знаю, как получить столбцы из таблицы, используя следующий оператор SQL:
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE (TABLE_NAME = 'MYTABLENAME')
Но как я могу просто вернуть то, что имя UNIQUE Key Column?
Я знаю, как получить столбцы из таблицы, используя следующий оператор SQL:
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE (TABLE_NAME = 'MYTABLENAME')
Но как я могу просто вернуть то, что имя UNIQUE Key Column?
Что-то вроде этого может работать (непроверено):
SELECT *
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC
WHERE TC.TABLE_NAME = 'MYTABLENAME'
AND TC.CONSTRAINT_TYPE = 'UNIQUE'
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'
Что-то вроде этого:
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
Два из них, которые я нашел для работы, следующие: второй был из исходного плаката, но без 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')
Спасибо всем за ваши сообщения
Не будет DESCRIBE TABLE_NAME; сделать трюк?
SELECT *
FROM mbiis.INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE TABLE_NAME='TABLE_NAME' AND CONSTRAINT_TYPE='UNIQUE';