基于SQLite foreign key documentation,它应该是创建两个数据库的方式,如果父字段得到更新,引用父字段的字段也会更新。
问题:一旦我按照下面的步骤操作,一切正常,直到最后一个命令
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
为什么会这样?
答案 0 :(得分: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';
然后你会在track
看到你所期待的100。当然,假设您的SQLite是使用FK支持编译的。