2013-04-19 4 views
1

На основе SQLite foreign key documentation он должен быть способом создания двух баз данных, и поле, которое ссылается на родительское поле, также будет обновляться, если родительское поле будет обновлено.SQLITE ON UPDATE Действия

Проблема: как только я следую шагу ниже, все работает нормально до последней команды SELECT * FROM track;, потому что результат по-прежнему остается таким же, как после того, как он должен измениться на результат, показанный последним.

trackid trackname   trackartist 
    ------- ----------------- ----------- 
    11  That's Amore  1 
    12  Christmas Blues 1 
    13  My Way    2 

кодирования:

-- Database schema 
CREATE TABLE artist(
    artistid INTEGER PRIMARY KEY, 
    artistname TEXT 
); 
CREATE TABLE track(
    trackid  INTEGER, 
    trackname TEXT, 
    trackartist INTEGER REFERENCES artist(artistid) ON UPDATE CASCADE 
); 

sqlite> SELECT * FROM artist; 
artistid artistname  
-------- ----------------- 
1   Dean Martin  
2   Frank Sinatra  

sqlite> SELECT * FROM track; 
trackid trackname   trackartist 
------- ----------------- ----------- 
11  That's Amore  1 
12  Christmas Blues 1 
13  My Way    2 

sqlite> -- Update the artistid column of the artist record for "Dean Martin". 
sqlite> -- Normally, this would raise a constraint, as it would orphan the two 
sqlite> -- dependent records in the track table. However, the ON UPDATE CASCADE clause 
sqlite> -- attached to the foreign key definition causes the update to "cascade" 
sqlite> -- to the child table, preventing the foreign key constraint violation. 
sqlite> UPDATE artist SET artistid = 100 WHERE artistname = 'Dean Martin'; 

sqlite> SELECT * FROM artist; 
artistid artistname  
-------- ----------------- 
2   Frank Sinatra  
100  Dean Martin  

sqlite> SELECT * FROM track; 
trackid trackname   trackartist 
------- ----------------- ----------- 
11  That's Amore  100 
12  Christmas Blues 100 
13  My Way    2 

Почему это?

ответ

1

Вы должны прочитать fine manual с большей осторожностью:

2. Включение внешнего ключа поддержки
[...]
Предполагая, что библиотека скомпилирована с поддержкой внешних ключей, он должен еще быть включенным приложением во время выполнения, используя команду PRAGMA foreign_keys. Например:

sqlite> PRAGMA foreign_keys = ON; 

ключевые Зарубежное ограничения по умолчанию отключены (для обратной совместимости), поэтому должна быть включена отдельно для каждого соединения с базой данных по отдельности.

Так что, если вы говорите, это:

sqlite> PRAGMA foreign_keys = ON; 
sqlite> UPDATE artist SET artistid = 100 WHERE artistname = 'Dean Martin'; 

, то вы увидите 100s в track, что вы ожидали. Конечно, предполагается, что ваш SQLite был скомпилирован с поддержкой FK.