Поделиться через


Создание связей по внешнему ключу

В данном разделе описывается создание связей внешнего ключа в SQL Server 2012 с помощью среды Среда SQL Server Management Studio или Transact-SQL. Связь создается между двумя таблицами, чтобы связать строки одной таблицы со строками другой.

В этом разделе

  • Перед началом работы выполните следующие действия.

    Ограничения

    Безопасность

  • Создание связей внешнего ключа с помощью:

    Среда SQL Server Management Studio

    Transact-SQL

Перед началом

Ограничения

  • Ограничение внешнего ключа не обязательно должно быть связано только с ограничением первичного ключа в другой таблице. Кроме того, это ограничение может быть определено для ссылки на столбцы с ограничением UNIQUE в другой таблице.

  • Если столбцу, имеющему ограничение внешнего ключа, задается значение, отличное от NULL, такое же значение должно существовать и в указываемом столбце; в противном случае будет возвращено сообщение о нарушении внешнего ключа. Для обеспечения проверки всех значений сложного ограничения внешнего ключа задайте параметр NOT NULL для всех столбцов, участвующих в индексе.

  • Ограничения FOREIGN KEY могут ссылаться только на таблицы в пределах той же базы данных на том же сервере. Межбазовую ссылочную целостность необходимо реализовать посредством триггеров. Дополнительные сведения см. в разделе CREATE TRIGGER (Transact-SQL).

  • Ограничения FOREIGN KEY могут ссылаться на другие столбцы той же таблицы. Это называется самовызовом.

  • Ограничение FOREIGN KEY, определенное на уровне столбцов, может содержать только один ссылочный столбец. Этот столбец должен принадлежать к тому же типу данных, что и столбец, для которого определяется ограничение.

  • Ограничение FOREIGN KEY, определенное на уровне таблицы, должно содержать такое же число ссылочных столбцов, какое содержится в списке столбцов в ограничении. Тип данных каждого ссылочного столбца должен также совпадать с типом соответствующего столбца в списке столбцов.

  • Компонент Компонент Database Engine не имеет стандартного предела на количество ограничений FOREIGN KEY, содержащихся в таблице, ссылающейся на другие таблицы, или на количество ограничений FOREIGN KEY в других таблицах, ссылающихся на указанную таблицу. Тем не менее фактическое количество ограничений FOREIGN KEY, доступных для использования, ограничивается конфигурацией оборудования, базы данных и приложения. Рекомендуется, чтобы таблица содержала не более 253 ограничений FOREIGN KEY, а также чтобы на нее ссылалось не более 253 ограничений FOREIGN KEY.

  • Ограничения FOREIGN KEY не применяются к временным таблицам.

  • Если внешний ключ определен на столбце определяемого пользователем типа данных CLR, реализация этого типа должна поддерживать двоичную сортировку. Дополнительные сведения см. в разделе Определяемые пользователем типы данных CLR.

  • Столбец типа varchar(max) может участвовать в ограничении FOREIGN KEY только при условии, что первичный ключ, на который он ссылается, также имеет тип данных varchar(max).

Безопасность

Разрешения

Создание новой таблицы с внешним ключом требует разрешения CREATE TABLE в базе данных и разрешения ALTER на схему, в которой создается таблица.

Создание внешнего ключа в существующей таблице требует разрешения ALTER на таблицу.

Значок стрелки, используемый со ссылкой «В начало»[Top]

Использование среды SQL Server Management Studio

Создание связи по внешнему ключу в конструкторе таблиц

  1. В обозревателе объектов щелкните правой кнопкой мыши таблицу, которая будет содержать внешний ключ для связи, и выберите пункт Конструктор.

    Таблица откроется в окне Конструктор таблиц.

  2. В меню конструктора таблиц выберите пункт Связи.

  3. В диалоговом окне Связи внешнего ключа щелкните Добавить.

    Связь появится в списке Выбранные связи с именем, установленным системой, в формате FK_<tablename>_<tablename>, где tablename является именем таблицы внешнего ключа.

  4. Щелкните нужную связь в списке Выбранные связи.

  5. Щелкните Спецификация таблиц и столбцов в сетке справа и нажмите кнопку с многоточием (...) справа от свойства.

  6. В диалоговом окне Таблицы и столбы в раскрывающемся списке Первичный ключ выберите таблицу, которая будет находиться на стороне первичного ключа связи.

  7. В сетке внизу выберите столбцы, составляющие первичный ключ таблицы. В соседней ячейке сетки слева от каждого столбца выберите соответствующий столбец внешнего ключа таблицы внешнего ключа.

    Конструктор таблиц автоматически предлагает имя для связи. Чтобы его изменить, отредактируйте содержимое текстового поля Имя связи.

  8. Нажмите кнопку OK, чтобы создать связь.

Значок стрелки, используемый со ссылкой «В начало»[Top]

Использование Transact-SQL

Создание внешнего ключа в новой таблице

  1. В обозревателе объектов установите соединение с экземпляром компонента Компонент Database Engine.

  2. На стандартной панели выберите пункт Создать запрос.

  3. Скопируйте следующий пример в окно запроса и нажмите кнопку Выполнить. В этом примере создается таблица и определяется ограничение внешнего ключа для столбца TempID, ссылающегося на столбец SalesReasonID в таблице Sales.SalesReason. Предложения ON DELETE CASCADE и ON UPDATE CASCADE используются для обеспечения распространения изменений, вносимых в таблицу Sales.SalesReason на таблицу Sales.TempSalesReason.

    USE AdventureWorks2012;
    GO
    CREATE TABLE Sales.TempSalesReason (TempID int NOT NULL, Name nvarchar(50), 
    CONSTRAINT PK_TempSales PRIMARY KEY NONCLUSTERED (TempID), 
    CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID) 
        REFERENCES Sales.SalesReason (SalesReasonID) 
        ON DELETE CASCADE
        ON UPDATE CASCADE
    );GO
    

Создание внешнего ключа в существующей таблице

  1. В обозревателе объектов установите соединение с экземпляром компонента Компонент Database Engine.

  2. На стандартной панели выберите пункт Создать запрос.

  3. Скопируйте следующий пример в окно запроса и нажмите кнопку Выполнить. В этом примере создается внешний ключ для столбца TempID, ссылающийся на столбец SalesReasonID в таблице Sales.SalesReason.

    USE AdventureWorks2012;
    GO
    ALTER TABLE Sales.TempSalesReason 
    ADD CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID) 
        REFERENCES Sales.SalesReason (SalesReasonID) 
        ON DELETE CASCADE
        ON UPDATE CASCADE
    ;
    GO
    

    Дополнительные сведения см. в разделах ALTER TABLE (Transact-SQL), Инструкция CREATE TABLE (Transact-SQL) и table_constraint (Transact-SQL).

Значок стрелки, используемый со ссылкой «В начало»[Top]