SQLite3 - 为什么参考数据不会被删除?

时间:2014-07-24 14:18:47

标签: sql sqlite

我对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表中的所有项目。

1 个答案:

答案 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删除了引用行。