Как мне найти внешний ключ таблицы с помощью Sql Server 2008?

#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