Внешние ключи в DB Browser for SQLite

Featured image

Сказ о том, как включить поддержку внешних ключей в популярной программе по редактированию SQLite баз данных.

Откроем программу DB Browser for SQLite.

Создадим новую базу данных, например, music.db:

Создание новой базы данных

Рисунок 1 — Создание новой базы данных

Не будем пока создавать таблицы:

Отказ от создания таблицы

Рисунок 2 — Отказ от создания таблицы

Включим поддержку внешних ключей. Не забудьте нажать на кнопку Save:

Включение поддержки внешних ключей

Рисунок 3 — Включение поддержки внешних ключей

Теперь покажем, как работают внешние ключи.

Создадим две таблицы artists (музыканты) и tracks (песни). Конструктор не будем использовать. Во второй таблице будем хранить номер музыканта как внешний ключ:

CREATE TABLE artists(
  _id    INTEGER PRIMARY KEY AUTOINCREMENT,
  name  TEXT
);

CREATE TABLE tracks(
  _id     INTEGER PRIMARY KEY AUTOINCREMENT,
  title   TEXT,
  id_artist INTEGER,
  FOREIGN KEY(id_artist) REFERENCES artists(_id)
);

Запуск SQL скрипта

Рисунок 4 — Запуск SQL скрипта

Созданные таблицы

Рисунок 5 — Созданные таблицы

Опять же без конструктора закинем две записи о двух исполнителях:

INSERT INTO artists (name) VALUES ('Nightwish');
INSERT INTO artists (name) VALUES ('Scooter');

Запуск SQL скрипта

Рисунок 6 — Запуск SQL скрипта

Созданные записи в таблицу

Рисунок 7 — Созданные записи в таблицу

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

INSERT INTO tracks (title, id_artist) VALUES ('Wishmaster', 1);

Запрос прошел успешно:

Запуск SQL скрипта по вставке новой записи

Рисунок 8 — Запуск SQL скрипта по вставке новой записи

А теперь попробуем добавить запись с несуществующим номером исполнителя:

INSERT INTO tracks (title, id_artist) VALUES ('To the Sky', 100);

А теперь запрос не пройдет из-за внешнего ключа:

Ошибка при выполнении SQL скрипта

Рисунок 9 — Ошибка при выполнении SQL скрипта

И в таблице tracks мы увидим только одну запись:

Записи в таблице

Рисунок 10 — Записи в таблице

Обратите внимание на то, что в SQLite можно добавлять внешние ключи через CREATE. В «полноценных» БД можно добавлять внешние ключи через ALTER. Но в SQLite это сделать нельзя:

ALTER TABLE child ADD CONSTRAINT fk_child_parent
                  FOREIGN KEY (parent_id)
                  REFERENCES parent(id);

И напоследок покажу, как сделать выборку песен из БД так, чтобы вместо номеров песен мы видели названия самих исполнителей.

Этот пример стандартного вызова SELECT, когда мы увидим песни с номерами исполнителей:

SELECT * FROM TRACKS;

Результат работы команды SELECT

Рисунок 11 — Результат работы команды SELECT

А вот пример кода, который вернет нам то, что нужно:

SELECT t._id, t.title, a.name AS a_name
FROM tracks t
LEFT JOIN artists a ON t.id_artist = a._id;

Результат работы команды SELECT

Рисунок 12 — Результат работы команды SELECT

Более упрощенный код запроса:

SELECT tracks._id, tracks.title, artists.name
FROM tracks
LEFT JOIN artists ON tracks.id_artist = artists._id;

Результат работы команды SELECT

Рисунок 13 — Результат работы команды SELECT

Рекомендую прочитать эту статью.