#sql-server-2008
#sql-server-2008
Вопрос:
Я могу получить столбцы таблицы в sql server, используя этот запрос:
select * from information_schema.columns where table_name = 'MyTable'
но как мне найти столбцы внешнего ключа, связанные с этой таблицей?
Ответ №1:
Это внутри information_schema.table_constraints
.
Редактировать:
Подождите, я думаю information_schema.key_column_usage
, что лучше:
select * from information_schema.key_column_usage where table_name = '...'
И затем, если вам нужно убедиться, что это действительно внешний ключ, запросите table_constraints, используя имя ограничения, которое вы получили сверху:
select * from information_schema.table_constraints where constraint_name = '...'
Комментарии:
1. большое спасибо, но как мне определить, какие столбцы связаны с каждым столбцом.
2. Должно быть
INFORMATION_SCHEMA.KEY_COLUMN_USAGE
etc, поэтому запросы обрабатывают сопоставление с учетом регистра.
Ответ №2:
Это позволит найти все ограничения FK для данной таблицы. Просто установите 'table_name'
имя вашей таблицы. Запрос приведен ниже:
DECLARE @TABLENAME VARCHAR(100);
SET @TABLENAME='table_name';
SELECT
K_Table = FK.TABLE_NAME,
FK_Column = CU.COLUMN_NAME,
PK_Table = PK.TABLE_NAME,
PK_Column = PT.COLUMN_NAME,
Constraint_Name = C.CONSTRAINT_NAME
FROM
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK
ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK
ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU
ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME
INNER JOIN (
SELECT
i1.TABLE_NAME,
i2.COLUMN_NAME
FROM
INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2
ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME
WHERE
i1.CONSTRAINT_TYPE = 'PRIMARY KEY'
) PT
ON PT.TABLE_NAME = PK.TABLE_NAME
WHERE PK.TABLE_NAME=@TABLENAME