Обратное каскадное удаление внешнего ключа sqlite - PullRequest
0 голосов
/ 09 июля 2020

У меня есть две таблицы фильмов и песен. песни имеют внешний ключ в фильмах. Мне нужно удалить запись mov ie, когда все песни, ссылающиеся на mov ie, удалены. точно так же, как обратный каскад, как многие к одному.

при удалении записей песни, если все песни будут удалены, mov ie следует удалить.

как я могу добиться этого на sqlite просто как каскадное удаление ..?

  • Элемент списка

1 Ответ

0 голосов
/ 10 июля 2020

Работает AFTER DELETE триггер . Пример сеанса оболочки sqlite3:

sqlite> PRAGMA foreign_keys=on;
sqlite> CREATE TABLE movies(id INTEGER PRIMARY KEY, name);
sqlite> CREATE TABLE songs(id INTEGER PRIMARY KEY, name, movie_id INTEGER REFERENCES movies(id) ON DELETE CASCADE);
sqlite> CREATE INDEX songs_movie_id_idx ON songs(movie_id);
sqlite> CREATE TRIGGER cleanup_movies AFTER DELETE ON songs WHEN ((SELECT count(*) FROM songs WHERE movie_id=old.movie_id) = 0) BEGIN DELETE FROM movies WHERE id = old.movie_id; END;
sqlite> INSERT INTO movie VALUES (1, 'Some Movie');
sqlite> INSERT INTO song VALUES (1, 'Some Song', 1), (2, 'Some Other Song', 1);
sqlite> DELETE FROM songs WHERE id = 1;
sqlite> SELECT * FROM movies;
id          name      
----------  ----------
1           Some Movie
sqlite> DELETE FROM songs WHERE id = 2;
sqlite> SELECT * FROM movies;
sqlite>

Триггер:

CREATE TRIGGER cleanup_movies AFTER DELETE ON songs
WHEN ((SELECT count(*) FROM songs WHERE movie_id=old.movie_id) = 0)
BEGIN
 DELETE FROM movies WHERE id = old.movie_id;
END;

После удаления строки из songs, если в таблице songs больше нет строк с тем же movie_id в качестве удаленной строки, удалите этот идентификатор из таблицы movies.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...