我对SQLite很陌生,所以请原谅我的无知和愚蠢的错误。
简
我目前有2个表,一个是保存公司名称的主表,第二个是与该公司相关的文章。
架构
表1
Companies(id INTEGER PRIMARY KEY AUTO INCREMENT, tick TEXT, business_name TEXT)
表2
Articles(id INTEGER PRIMARY KEY,
tick TEXT, thedate TEXT, thetime TEXT, title TEXT, link TEXT,
FOREIGN KEY(tick) REFERENCES Companies(tick) ON DELETE CASCADE)
为什么这不起作用?删除Companies
表中的勾选后,它不会删除Articles
表中的所有项目。
答案 0 :(得分:2)
每个数据库连接都必须enable foreign key support。
假设在编译库时启用了外键约束, 它必须仍然由应用程序在运行时启用,使用 PRAGMA foreign_keys命令。例如:
源码> PRAGMA foreign_keys = ON;
这是一个示例会话。请注意" tick" {/ p>上的unique
约束
sqlite> create table companies(
...> id INTEGER PRIMARY KEY AUTOINCREMENT,
...> tick TEXT unique,
...> business_name TEXT
...> );
sqlite>
sqlite> create table articles(
...> id INTEGER PRIMARY KEY,
...> tick TEXT,
...> thedate TEXT,
...> thetime TEXT,
...> title TEXT,
...> link TEXT,
...> FOREIGN KEY(tick) REFERENCES Companies(tick) ON DELETE CASCADE
...> );
sqlite>
sqlite> insert into companies values (1, 'aaa', 'AAA company');
sqlite> insert into articles values (1, 'bbb', '2014-01-01', '08:00', 'Some Title', 'some link');
该insert语句成功,因为虽然我们声明了一个外键约束,但我们还没有启用它。让我们摆脱那些数据。 。
sqlite> delete from companies;
sqlite> delete from articles;
启用外键约束。 。
sqlite> pragma foreign_keys=on;
再试一次。
sqlite> insert into companies values (1, 'aaa', 'AAA company');
sqlite> insert into articles values (1, 'aaa', '2014-01-01', '08:00', 'Some Title', 'some link');
sqlite> select * from articles where tick = 'aaa';
1|aaa|2014-01-01|08:00|Some Title|some link
我们的文章。
sqlite> delete from companies where tick = 'aaa';
sqlite> select * from articles where tick = 'aaa';
sqlite>
没有返回,因为on delete cascade
删除了引用行。