В этом учебном пособии вы узнаете, как использовать (внешний ключ) в SQL Server (Transact-SQL) с синтаксисом и примерами.
Описание
Внешний ключ - это способ обеспечения ссылочной целостности в вашей базе данных SQL Server. Внешний ключ означает, что значения в одной таблице также должны отображаться в другой таблице.
Указанная таблица называется родительской таблицей, а таблица с внешним ключом называется дочерней таблицей. Внешний ключ в дочерней таблице обычно ссылается на первичный ключ в родительской таблице.
Внешний ключ может быть создан с использованием оператора CREATE TABLE или оператора ALTER TABLE.
Создание внешнего ключа - использование оператора CREATE TABLE
Синтаксис
Синтаксис создания внешнего ключа с помощью оператора CREATE TABLE в SQL Server (Transact-SQL):
(
column1 datatype [ NULL | NOT NULL ],
column2 datatype [ NULL | NOT NULL ],
...
CONSTRAINT fk_name
FOREIGN KEY (child_col1, child_col2, ... child_col_n)
REFERENCES parent_table (parent_col1, parent_col2, ... parent_col_n)
[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
);
child_table - имя дочерней таблицы, которую вы хотите создать.
column1, column2 - столбцы, которые вы хотите создать в таблице. Каждый столбец должен иметь тип данных. Столбец должен быть определен как NULL или NOT NULL, и если это значение остается пустым, база данных принимает значение NULL как значение по умолчанию.
fk_name - имя ограничения внешнего ключа, которое вы хотите создать.
child_col1, child_col2, ... child_col_n - столбцы в child_table, которые будут ссылаться на первичный ключ в parent_table (родительской таблице).
parent_table - имя родительской таблицы, первичный ключ которой будет использоваться в child_table.
parent_col1, parent_col2, ... parent_col3 - столбцы, которые составляют первичный ключ в родительской таблице. Внешний ключ будет обеспечивать связь между этими данными и столбцами child_col1, child_col2, ... child_col_n в child_table.
ON DELETE - необязательный. Он определяет, что делать с дочерними данными при удалении родительских данных. У вас есть опции NO ACTION, CASCADE, SET NULL или SET DEFAULT.
ON UPDATE - необязательный. Он указывает, что делать с дочерними данными при обновлении родительских данных. У вас есть опции NO ACTION, CASCADE, SET NULL или SET DEFAULT.
NO ACTION - используется в сочетании с ON DELETE или ON UPDATE. Это означает, что никакие действия не выполняются с дочерними данными при удалении или обновлении родительских данных.
CASCADE - используется в сочетании с ON DELETE или ON UPDATE. Это означает, что дочерние данные либо удаляются, либо обновляются, когда родительские данные удаляются или обновляются.
SET NULL - используется в сочетании с ON DELETE или ON UPDATE. Это означает, что дочерние данные установлены в NULL, когда родительские данные удаляются или обновляются.
SET DEFAULT - используется в сочетании с ON DELETE или ON UPDATE. Это означает, что дочерние данные устанавливаются в значения по умолчанию, когда родительские данные удаляются или обновляются.
Пример
Рассмотрим пример создания внешнего ключа в SQL Server (Transact-SQL) с помощью оператора CREATE TABLE. Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
CREATE TABLE products ( product_id INT PRIMARY KEY, product_name VARCHAR(50) NOT NULL, category VARCHAR(25) ); CREATE TABLE inventory ( inventory_id INT PRIMARY KEY, product_id INT NOT NULL, quantity INT, min_level INT, max_level INT, CONSTRAINT fk_inv_product_id FOREIGN KEY (product_id) REFERENCES products (product_id) ); |
В этом примере внешнего ключа мы создали родительскую таблицу products. Таблица products имеет первичный ключ, который состоит из поля product_id.
Затем мы создали вторую таблицу под названием inventory, которая будет дочерней таблицей в этом примере внешнего ключа. Мы использовали оператор CREATE TABLE для создания внешнего ключа в таблице inventory, называемой fk_inv_product_id. Внешний ключ устанавливает связь между столбцом product_id в таблице inventory и столбцом product_id в таблице products.
В первом примере показано, как создать внешний ключ с одним столбцом. Давайте посмотрим, как создать внешний ключ с несколькими полями.
Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
CREATE TABLE products ( product_name VARCHAR(50) NOT NULL, location VARCHAR(50) NOT NULL, category VARCHAR(25) CONSTRAINT products_pk PRIMARY KEY (product_name, location) ); CREATE TABLE inventory ( inventory_id INT PRIMARY KEY, product_name VARCHAR(50) NOT NULL, location VARCHAR(50) NOT NULL, quantity INT, min_level INT, max_level INT, CONSTRAINT fk_inv_product FOREIGN KEY (product_name, location) REFERENCES products (product_name, location) ); |
В этом примере внешнего ключа наша родительская таблица products, имеет первичный ключ, который состоит из столбцов product_name и location. Поэтому наша дочерняя таблица и внешний ключ должны также ссылаться на эти два столбца.
Поэтому в этом примере наш внешний ключ, называемый fk_inv_product, ссылается на таблицу products на основе двух полей product_name и location.
Создание внешнего ключа - использование оператора ALTER TABLE
Синтаксис
Синтаксис создания внешнего ключа с использованием оператора ALTER TABLE в SQL Server (Transact-SQL):
ADD CONSTRAINT fk_name
FOREIGN KEY (child_col1, child_col2, ... child_col_n)
REFERENCES parent_table (parent_col1, parent_col2, ... parent_col_n);
child_table - имя дочерней таблицы, которую вы хотите изменить.
fk_name - имя ограничения внешнего ключа, которое вы хотите создать.
child_col1, child_col2, ... child_col_n - столбцы в child_table, которые будут ссылаться на первичный ключ в parent_table (родительской таблице).
parent_table - имя родительской таблицы, первичный ключ которой будет использоваться в child_table.
parent_col1, parent_col2, ... parent_col3 - столбцы, которые составляют первичный ключ в родительской таблице. Внешний ключ будет обеспечивать связь между этими данными и столбцами child_col1, child_col2, ... child_col_n в child_table.
Пример
Рассмотрим пример создания внешнего ключа в SQL Server (Transact-SQL) с помощью оператора ALTER TABLE. Например:
1 2 3 4 |
ALTER TABLE inventory ADD CONSTRAINT fk_inv_product_id FOREIGN KEY (product_id) REFERENCES products (product_id); |
В этом примере внешнего ключа мы создали внешний ключ fk_inv_product_id в таблице inventory, который ссылается на таблицу products на основе поля product_id.
Мы могли бы также создать внешний ключ с несколькими полями, как показано в примере ниже:
1 2 3 4 |
ALTER TABLE inventory ADD CONSTRAINT fk_inv_product FOREIGN KEY (product_name, location) REFERENCES products (product_name, location); |
В этом примере SQL Server мы создали внешний ключ fk_inv_product в таблице inventory, который ссылается на таблицу products на основе столбцов product_name и location.