2014-03-21 4 views
0

У меня есть эти таблицы:ошибки при создании SQLITE триггера

+-------------------------+ 
|   Movies   | 
+-----+--------+----------+ 
| _id | title | language | 
+--+--+--------+----------+ 
    | 
    +-------------------------+ 
           | 
+----------------------------------+ 
|   Movie_Cast   | 
+------------+----------+----------+ 
| id   | actor_id | movie_id | 
+------------+-----+----+----------+ 
        | 
     +-------------+ 
     | 
+-------------------+ 
|  Actors  | 
+----------+--------+ 
| actor_id | name | 
+----------+--------+ 

То, что я пытаюсь сделать, это удалить строку фильмов, удалить также соответствующие строки из соединительной таблицы (movie_cast). И, наконец, удалите из таблицы участников все строки, на которые не ссылаются в таблице movie_cast.

это таблица схема:

create table movies (_id INTEGER PRIMARY KEY, title TEXT, language TEXT); 

create table movie_cast (id INTEGER PRIMARY KEY, 
     actor_id INTEGER REFERENCES actors(actor_id) ON DELETE RESTRICT, 
     movie_id INTEGER REFERENCES movies(_id) ON DELETE CASCADE); 

create table actors (actor_id INTEGER PRIMARY KEY, actor TEXT UNIQUE); 

прямо сейчас, когда пользователь удаляет запись фильмов, movie_cast строки, ссылающаяся на movies._id также удаляется. (у меня были некоторые проблемы с этим, но затем я использовал «PRAGMA foreign_keys = ON;»), пока что так хорошо! Чтобы удалить строки участников, я подумал, что могу создать триггер, который пытается удалить записи участников на основе movie_cast.actor_id, который мы просто удалили, но так как я использую «ON DELETE RESTRIC», если у актера есть ссылка, это будет прервать удаление.

Но я даже не будучи в состоянии доказать это, потому что при создании триггера я получаю сообщение об ошибке:

CREATE TRIGGER Delete_Actors AFTER DELETE ON movie_cast 
FOR EACH ROW 
BEGIN 
DELETE FROM actors WHERE actors.actor_id = OLD.actor_id; 
END; 

SQL Error [1]: [SQLITE_ERROR] SQL error or missing database (near "actor_id": syntax error) 
    [SQLITE_ERROR] SQL error or missing database (near "actor_id": syntax error) 

Кажется, он не знает, что старое. Что я здесь делаю неправильно?

UPDATE:

Похоже SQLITE проблемы конфигурации. Я использую DBeaver SQLite 3.8.2, и это, кажется, проблема с временным файлом, но если честно, я не знаю, как это исправить даже чтение возможное решение:

It's failing to create the temporary file required for a statement journal. 
It's likely any statement that uses a temporary file will fail. 

    http://www.sqlite.org/tempfiles.html 

One way around the problem would be to configure SQLite not to use 
temp files using "PRAGMA temp_store = memory;". 

Or ensure that the environment variable SQLITE_TMPDIR is set to 
the path of a writable directory. See also: 

    http://www.sqlite.org/c3ref/temp_directory.html 

Итак, Я собираюсь предположить, что он работает, и попробуйте прямо в моем приложении для Android.

+0

Работы для меня. Как вы создаете триггер? –

+0

@CL. CREATE TRIGGER Delete_Actors ПОСЛЕ УДАЛЕНИЯ ON movie_cast ДЛЯ КАЖДОЙ ROW НАЧАЛО УДАЛИТЬ ОТ актеров WHERE players.actor_id = OLD.actor_id; КОНЕЦ; – ILovemyPoncho

ответ

0

Это было что-то действительно s **** p. Для DBeaver создание триггера - сложный оператор, и разделители тоже не работали, поэтому нужно было выбрать весь оператор, а затем нажать ctrl + enter.

В любом случае, заявление работает. Но для лучших результатов я избавился от «ON DELETE RESTRICT» из movie_cast.actor_id. и создал условный триггер, который выполняет удаление из таблицы актеров, только тогда, когда больше нет actor_ids, равные одному только удаляемого (OLD):

CREATE TRIGGER Delete_Actors 
AFTER DELETE ON movie_cast 
FOR EACH ROW 
WHEN (SELECT count(id) FROM movie_cast WHERE actor_id = OLD.actor_id) = 0 
BEGIN 
    DELETE FROM actors WHERE actors.actor_id = OLD.actor_id; 
END; 
Смежные вопросы