Foreign Keys SQLite

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

Описание

Внешний ключ (Foreign Keys) — это способ обеспечить ссылочную целостность в вашей базе данных 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)
);

Пример

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

Например:

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

INSERT INTO table1 SELECT * FROM _table1_old;

COMMIT;

PRAGMA foreign_keys=on;

Пример

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

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

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

Этот пример переименует нашу существующую таблицу employees в _employees_old. Затем он создаст новую таблицу employees с внешним ключом fk_departments, который ссылается на таблицу departments на основе поля department_id. Затем он вставит все данные из таблицы _employees_old в таблицу employees.

Этот альтернативный путь позволяет добавить внешний ключ в таблицу employees, не теряя данные в таблице.