Foreign Keys with Set Null on Delete SQLite

В этом учебном пособии вы узнаете, как использовать Foreign Keys with "set null on delete" в SQLite с синтаксисом и примерами.

Описание

Внешний ключ с «set null on delete» означает, что если запись в родительской таблице будет удаляться, то соответствующие записи в дочерней таблице, которые будут иметь поля внешнего ключа, равные null, то записи в дочерней таблице не будут удалены.

Внешний ключ с «set null on delete» может быть определен только в операторе CREATE TABLE.

Подсказка: Вы не можете добавить внешний ключ с «set null on delete» к таблице, используя ALTER TABLE, потому что SQLite не поддерживает ADD CONSTRAINT в операторе ALTER TABLE. Однако позже в этом руководстве мы покажем вам альтернативный путь, который позволит вам добавить внешний ключ с «set null on delete» к существующей таблице.

Как создать внешний ключ с «Set Null on Delete» с помощью оператора CREATE TABLE

Синтаксис

Синтаксис для создания внешнего ключа с «set null on delete» с помощью оператора CREATE TABLE в SQLite:

CREATE TABLE table_name
(
column1 datatype [ NULL | NOT NULL ],
column2 datatype [ NULL | NOT NULL ],
...

CONSTRAINT fk_column
FOREIGN KEY (column1, column2, ... column_n)
REFERENCES parent_table (column1, column2, ... column_n)
ON DELETE SET NULL
);

Пример

Рассмотрим пример того, как создать внешний ключ с «set null on delete», используя оператора CREATE TABLE в SQLite.

Например:

В этом примере мы создали первичный ключ в таблице departments, который состоит только из одного поля - поля department_id. Затем мы создали внешний ключ с именем fk_departments в таблице employees, который ссылается на таблицу departments на основе поля department_id.

Из-за опции ON DELETE SET NULL, когда запись в таблице departments удаляется, все соответствующие записи в таблице employees будут иметь для department_id значение NULL.

Как добавить внешний ключ с «set null on delete» в существующую таблицу

Вы не можете использовать оператор ALTER TABLE для добавления внешнего ключа с «set null on delete» в SQLite. Вместо этого вам нужно будет переименовать таблицу, создать новую таблицу с внешним ключом, а затем скопировать данные в новую таблицу.

Синтаксис

Синтаксис для добавления внешнего ключа с «set null on delete» к существующей таблице в SQLite:

PRAGMA foreign_keys=off;

BEGIN TRANSACTION;

ALTER TABLE table1 RENAME TO _table1_old;

CREATE TABLE table1
(
column1 datatype [ NULL | NOT NULL ],
column2 datatype [ NULL | NOT NULL ],
...

CONSTRAINT fk_column
FOREIGN KEY (column1, column2, ... column_n)
REFERENCES parent_table (column1, column2, ... column_n)
ON DELETE SET NULL
);

INSERT INTO table1 SELECT * FROM _table1_old;

COMMIT;

PRAGMA foreign_keys=on;

Пример

Во-первых, давайте начнем с создания наших 2 таблиц (departments и employees):

Далее давайте добавим некоторые данные в эти таблицы:

Теперь давайте добавим внешний ключ с ON DELETE SET NULL в таблицу employees:

В этом примере мы создали внешний ключ c (set null on delete) с именем fk_departments, который ссылается на таблицу departments на основе поля department_id.

Теперь давайте продемонстрируем, как работает ON DELETE SET NULL. В настоящее время у нас есть следующие записи в таблице employees:

employee_id last_name first_name department_id
10000 Smith Samanta 30
10001 Anderson Gans 999

Теперь давайте удалим одну из записей из таблицы departments и посмотрим, что произойдет:

Даже несмотря на то, что мы удаляем запись из таблицы departments, где для department_id установлено значение 30, внешний ключ (с установленным нулевым значением при удалении) обновит таблицу employees и изменит все значения department_id на NULL, где для значения department_id будет 30.

После удаления таблица сотрудников будет выглядеть так:

employee_id last_name first_name department_id
10000 Smith Samanta Null
10001 Anderson Gans 999