Foreign Keys with Cascade Delete SQLite

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

Описание

Внешний ключ с каскадным удалением (Foreign Keys with cascade delete) означает, что если запись в родительской таблице будет удалена, то соответствующие записи в дочерней таблице будут автоматически удалены. Это называется каскадным удалением в SQLite.

Внешний ключ с каскадным удалением может быть определен только в операторе CREATE TABLE.

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

Как создать внешний ключ с каскадным удалением с помощью оператора CREATE TABLE

Синтаксис

Синтаксис для создания внешний ключ с каскадным удалением с использованием оператора 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 CASCADE
);

Пример

Рассмотрим пример того, как создать внешний ключ с каскадным удалением с помощью оператора CREATE TABLE в SQLite.

Например:

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

Из-за каскадного удаления при удалении записи в таблице departments также будут удалены все записи в таблице employees, имеющие одинаковое значение department_id.

Как добавить внешний ключ с каскадным удалением к существующей таблице

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

Синтаксис

Синтаксис для добавления внешнего ключа с каскадным удалением к существующей таблице в 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 CASCADE
);

INSERT INTO table1 SELECT * FROM _table1_old;

COMMIT;

PRAGMA foreign_keys=on;

Пример

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

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

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

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

Теперь давайте продемонстрируем, как работает каскадное удаление. В настоящее время у нас есть следующие записи в таблице 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 равно 30.

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

employee_id last_name first_name department_id
10001 Anderson Gans 999