Как включить поддержку внешних ключей в популярной программе по редактированию SQLite баз данных.
Откроем программу DB Browser for SQLite.
Создадим новую базу данных, например, music.db.
Не будем пока создавать таблицы.
Включим поддержку внешних ключей. Не забудьте нажать на кнопку Save.
Теперь покажем, как работают внешние ключи.
Создадим две таблицы artists (музыканты) и tracks (песни). Конструктор не будем использовать. Во второй таблице будем хранить номер музыканта как внешний ключ.
1 2 3 4 5 6 7 8 9 10 11 |
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) ); |
Опять же без конструктора закинем две записи о двух исполнителях.
1 2 |
INSERT INTO artists (name) VALUES ('Nightwish'); INSERT INTO artists (name) VALUES ('Scooter'); |
Попробуем добавить записи к таблице песню с правильным номером исполнителя.
1 |
INSERT INTO tracks (title, id_artist) VALUES ('Wishmaster', 1); |
Запрос прошел успешно.
А теперь попробуем добавить запись с несуществующим номером исполнителя.
1 |
INSERT INTO tracks (title, id_artist) VALUES ('To the Sky', 100); |
А теперь запрос не пройдет из-за внешнего ключа.
И в таблице tracks мы увидим только одну запись.
Обратите внимание на то, что в SQLite можно добавлять внешние ключи через CREATE. В «полноценных» БД можно добавлять внешние ключи через ALTER. Но в SQLite это сделать нельзя.
1 2 3 |
ALTER TABLE child ADD CONSTRAINT fk_child_parent FOREIGN KEY (parent_id) REFERENCES parent(id); |
И напоследок покажу, как сделать выборку песен из БД так, чтобы вместо номеров песен мы видели названия самих исполнителей.
Этот пример стандартного вызова SELECT, когда мы увидим песни с номерами исполнителей.
1 |
SELECT * FROM TRACKS; |
А вот пример кода, который вернет нам то, что нужно.
1 2 3 |
SELECT t._id, t.title, a.name AS a_name FROM tracks t LEFT JOIN artists a ON t.id_artist = a._id; |
Более упрощенный код запроса.
1 2 3 |
SELECT tracks._id, tracks.title, artists.name FROM tracks LEFT JOIN artists ON tracks.id_artist = artists._id; |
Рекомендую прочитать эту статью.