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


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

Область применения: SQL Server 2016 (13.x) и более поздних версий База данных SQL Azure Управляемый экземпляр SQL Azure

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

Разрешения

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

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

Ограничения

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

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

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

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

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

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

  • Ядро СУБД не имеет предопределенного ограничения на количество ограниченийFOREIGN KEY, которые могут содержать ссылки на другие таблицы. Ядро СУБД также не ограничивает количество ограничений, принадлежащих FOREIGN KEY другим таблицам, ссылающимся на определенную таблицу. Однако фактическое количество используемых FOREIGN KEY ограничений ограничено конфигурацией оборудования и структурой базы данных и приложения. Максимальное количество таблиц и столбцов, на которые может ссылаться таблица в качестве внешних ключей (исходящих ссылок), равно 253. SQL Server 2016 (13.x) и более поздних версий увеличьте количество других таблиц и столбцов, которые могут ссылаться на столбцы в одной таблице (входящие ссылки), с 253 до 10 000. (Требуется уровень совместимости не менее 130.) Увеличение имеет следующие ограничения:

    • Для операций DML поддерживаются DELETE UPDATE более 253 внешних ссылок на ключи. MERGE операции не поддерживаются.

    • Таблица со ссылкой внешнего ключа на саму себя по-прежнему ограничена 253 ссылками на внешние ключи.

    • Более 253 ссылок на внешний ключ в настоящее время недоступны для индексов columnstore или таблиц, оптимизированных для памяти.

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

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

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

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

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

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

    Откроется таблица в таблицах создания и обновления баз данных.

  2. В меню конструктора таблиц выберите Связи. (См. меню Конструктор таблиц в заголовке или щелкните правой кнопкой мыши пустое место определения таблицы и выберите Связи.)

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

    Связь отображается в списке выбранных связей с системным именем в формате FK_<tablename>_<tablename>, где первое имя таблицы — имя внешней таблицы ключей, а второе имя таблицы — имя таблицы первичного ключа. Это просто соглашение об именовании по умолчанию и общее соглашение об именовании для поля (Name) объекта внешнего ключа.

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

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

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

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

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

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

  9. Закройте окно конструктора таблиц и сохраните внесенные изменения, чтобы изменения связи внешнего ключа вступили в силу.

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

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

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

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
);

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

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

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

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