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'
это сильно зависит от используемой базы данных. Какую базу данных вы используете? –
@ Xavier - если это не встроенная БД, большинство из них теперь поддерживают ANSI 'information_schema' – Donnie
Также вполне приемлемо иметь более одного уникального ключа на таблице ... Предполагаю, что вы имеете в виду первичный ключ, хотя это может быть составным из нескольких столбцов –