Что такое внешний ключ?
FOREIGN KEY обеспечивает способ соблюдения ссылочной целостности в SQL Server. Проще говоря, внешний ключ гарантирует, что значения в одной таблице должны присутствовать в другой таблице.
Правила для внешнего ключа
- NULL допускается во внешнем ключе.
- Таблица, на которую ссылаются, называется родительской таблицей.
- Таблица с внешним ключом называется Child Table.
- Внешний ключ в дочерней таблице ссылается на первичный ключ в родительской таблице.
- Эти родительско-дочерние отношения обеспечивают соблюдение правила, известного как «ссылочная целостность».
Ниже на диаграмме обобщены все вышеперечисленные пункты для внешнего ключа.
В этом уроке вы узнаете
Как создать внешний ключ
Мы можем создать Foreign Key в 2 способами:
- SQL Server Management Studio
- T-SQL
SQL Server Management Studio
Родительская таблица. Скажем, у нас есть родительская таблица «Курс». Course_ID и Course_name — это два столбца с Course_Id в качестве первичного ключа.
Дочерняя таблица: нам нужно создать вторую таблицу как дочернюю таблицу. «Course_ID» и «Course_Strength» в виде двух столбцов. Однако ‘Course_ID’ должен быть внешним ключом.
Шаг 1) Щелкните правой кнопкой мыши Таблицы> Создать> Таблица…
Шаг 2) Введите два имени столбца как «Course_ID» и «Course_Strength». Щелкните правой кнопкой мыши столбец «Course_Id». Теперь нажмите на Отношения.
Шаг 3) В «Связи по внешнему ключу » нажмите «Добавить»
Шаг 4) В «Спецификации таблицы и столбца» нажмите значок «…»
Шаг 5) Выберите «Таблица первичных ключей» как «КУРС», и новая таблица теперь создается как «Таблица внешних ключей» из выпадающего списка.
Шаг 6) «Таблица первичных ключей» — выберите столбец «Course_Id» в качестве столбца «Таблица первичных ключей».
«Таблица внешнего ключа» — выберите столбец «Course_Id» в качестве столбца «Таблица внешнего ключа». Нажмите ОК.
Шаг 7) Нажмите Добавить.
Шаг 8) Дайте имя Таблице как ‘Course_Strength’ и нажмите OK.
Результат: мы установили отношения между родителями и детьми между «Course» и «Course_strength».
T-SQL: создайте таблицу Parent-child, используя T-SQL
Родительская таблица: Пересмотрим, у нас есть родительская таблица с именем таблицы «Курс».
Course_ID и Course_name — это два столбца с Course_Id в качестве первичного ключа.
Дочерняя таблица: нам нужно создать вторую таблицу как дочернюю таблицу с именем «Course_Strength_TSQL».
«Course_ID» и «Course_Strength» как два столбца для дочерней таблицы Course_Strength_TSQL. ‘ Однако ‘Course_ID’ должен быть внешним ключом.
Ниже приведен синтаксис для создания таблицы с FOREIGN KEY
Синтаксис:
CREATE TABLE childTable ( column_1 datatype [ NULL |NOT NULL ], column_2 datatype [ NULL |NOT NULL ], ... CONSTRAINT fkey_name FOREIGN KEY (child_column1, child_column2, ... child_column_n) REFERENCES parentTable (parent_column1, parent_column2, ... parent_column_n) [ ON DELETE { NO ACTION |CASCADE |SET NULL |SET DEFAULT } ] [ ON UPDATE { NO ACTION |CASCADE |SET NULL |SET DEFAULT } ] );
Вот описание вышеуказанных параметров:
- childTable — это имя таблицы, которая должна быть создана.
- column_1, column_2 — столбцы, которые будут добавлены в таблицу.
- fkey_name — имя ограничения внешнего ключа, которое будет создано.
- child_column1, child_column2… child_column_n — имя столбцов chidTable для ссылки на первичный ключ в parentTable.
- parentTable — имя родительской таблицы, ключ которой должен указываться в дочерней таблице.
- parent_column1, parent_column2, … parent_column3 — столбцы, составляющие первичный ключ родительской таблицы.
- НА УДАЛЕНИИ. Необязательный параметр. Он указывает, что происходит с дочерними данными после удаления родительских данных. Некоторые из значений для этого параметра включают NO ACTION, SET NULL, CASCADE или SET DEFAULT.
- ON UPDATE — необязательный параметр. Он указывает, что происходит с дочерними данными после обновления родительских данных. Некоторые из значений для этого параметра включают NO ACTION, SET NULL, CASCADE или SET DEFAULT.
- NO ACTION- используется вместе с ON DELETE и ON UPDATE. Это означает, что ничего не произойдет с дочерними данными после обновления или удаления родительских данных.
- CASCADE — используется вместе с ON DELETE и ON UPDATE. Дочерние данные будут удалены или обновлены после удаления или обновления родительских данных.
- SET NULL — используется вместе с ON DELETE и ON UPDATE. Дочерний элемент будет установлен в нуль после того, как родительские данные были обновлены или удалены.
- SET DEFAULT — используется вместе с ON DELETE и ON UPDATE. Дочерние данные будут установлены в значения по умолчанию после обновления или удаления родительских данных.
Давайте создадим таблицу с одним столбцом в качестве внешнего ключа.
Запрос:
CREATE TABLE Course_Strength_TSQL ( Course_ID Int, Course_Strength Varchar(20) CONSTRAINT FK FOREIGN KEY (Course_ID) REFERENCES COURSE (Course_ID) )
Шаг 1) Запустите запрос, нажав выполнить.
Результат: мы установили отношения «родитель-ребенок» между «Course» и «Course_strength_TSQL».
Использование ALTER TABLE
Чтобы создать внешний ключ с помощью инструкции ALTER TABLE, мы используем следующий синтаксис:
ALTER TABLE childTable ADD CONSTRAINT fkey_name FOREIGN KEY (child_column1, child_column2, ... child_column_n) REFERENCES parentTable (parent_column1, parent_column2, ... parent_column_n);
Вот описание параметров, использованных выше:
- childTable — это имя таблицы, которая должна быть создана.
- column_1, column_2 — столбцы, которые будут добавлены в таблицу.
- fkey_name — имя ограничения внешнего ключа, которое будет создано.
- child_column1, child_column2… child_column_n — имя столбцов chidTable для ссылки на первичный ключ в parentTable.
- parentTable — имя родительской таблицы, ключ которой должен указываться в дочерней таблице.
- parent_column1, parent_column2, … parent_column3 — столбцы, составляющие первичный ключ родительской таблицы.
Например:
ALTER TABLE department ADD CONSTRAINT fkey_student_admission FOREIGN KEY (admission) REFERENCES students (admission);
Мы создали внешний ключ с именем fkey_student_admission в таблице отдела. Этот внешний ключ ссылается на столбец допуска таблицы студентов.
Пример запроса внешнего ключа
Во-первых, давайте посмотрим наши данные родительской таблицы, курс.
Запрос:
SELECT * from COURSE;
Теперь давайте вставим некоторую строку в дочернюю таблицу: ‘Course_strength_TSQL.’
Мы попытаемся вставить два типа строк.
- Первый тип, для которого Course_Id в дочерней таблице будет существовать в Course_Id родительской таблицы. т.е. Course_Id = 1 и 2
- Второй тип, для которого Course_Id в дочерней таблице не существует в Course_Id родительской таблицы. т.е. Course_Id = 5
Запрос:
Insert into COURSE_STRENGTH values (1,'SQL'); Insert into COURSE_STRENGTH values (2,'Python'); Insert into COURSE_STRENGTH values (5,'PERL');
Результат: давайте запустим Query вместе, чтобы увидеть нашу таблицу Parent и Child
Строка с Course_ID 1 и 2 существует в таблице Course_strength. Принимая во внимание, что Course_ID 5 является исключением.
Резюме:
- Каждое значение внешнего ключа должно быть частью первичного ключа других таблиц.
- Внешний ключ может ссылаться на другой столбец в той же таблице. Эта ссылка известна как самостоятельная ссылка.
- Вы можете создать внешний ключ, используя Create Table, Alter Table или SQL Server Management Studio.