Как определить, находится ли столбец в первичном ключе своей таблицы? (SQL-сервер)

в настоящее время я использую...

select Table_Name, Column_name, data_type, is_Nullable
from information_Schema.Columns

...чтобы определить информацию о Столбцах в данной базе данных для создания слоя DataAccess.

откуда я могу получить информацию о том, являются ли эти столбцы участниками первичного ключа их таблицы?

3 ответов


вот один из способов (замените "keycol" на имя столбца, который вы ищете for):

SELECT K.TABLE_NAME,
K.COLUMN_NAME,
K.CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS C
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS K
ON C.TABLE_NAME = K.TABLE_NAME
AND C.CONSTRAINT_CATALOG = K.CONSTRAINT_CATALOG
AND C.CONSTRAINT_SCHEMA = K.CONSTRAINT_SCHEMA
AND C.CONSTRAINT_NAME = K.CONSTRAINT_NAME
WHERE C.CONSTRAINT_TYPE = 'PRIMARY KEY'
AND K.COLUMN_NAME = 'keycol';

аналогично, следующее даст вам информацию обо всех таблицах и их ключах вместо информации о конкретных столбцах. Таким образом, вы убедитесь, что у вас есть все колонки интересов и знаете, в чем они участвуют. Чтобы просмотреть все ключи (первичные, внешние, уникальные), прокомментируйте предложение WHERE.

SELECT K.TABLE_NAME, C.CONSTRAINT_TYPE, K.COLUMN_NAME, K.CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS C
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS K
ON C.TABLE_NAME = K.TABLE_NAME
AND C.CONSTRAINT_CATALOG = K.CONSTRAINT_CATALOG
AND C.CONSTRAINT_SCHEMA = K.CONSTRAINT_SCHEMA
AND C.CONSTRAINT_NAME = K.CONSTRAINT_NAME
WHERE C.CONSTRAINT_TYPE = 'PRIMARY KEY'
ORDER BY K.TABLE_NAME, C.CONSTRAINT_TYPE, K.CONSTRAINT_NAME

для вашей потребности, полное внешнее соединение с INFORMATION_SCHEMA.Столбцы и INFORMATION_SCHEMA.KEY_COLUMN_USAGE. В инструкции select добавьте столбец CONSTRAINT_NAME из INFORMATION_SCHEMA.KEY_COLUMN_USAGE, который даст вам null или keyname.

select C.Table_Name, C.Column_name, data_type, is_Nullable, U.CONSTRAINT_NAME
from information_Schema.Columns C FULL OUTER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE U ON C.COLUMN_NAME = U.COLUMN_NAME
WHERE C.TABLE_NAME=@TABLENAME