我正在尝试使用foo
和bar
s设置SQLite3数据库,并在它们之间建立多对多关系。这是我到目前为止所得到的:
CREATE TABLE foo(
id INTEGER PRIMARY KEY NOT NULL,
foo_col INTEGER NOT NULL
);
CREATE TABLE bar(
id INTEGER PRIMARY KEY NOT NULL,
bar_col TEXT NOT NULL
);
CREATE TABLE foobar(
foo_id INTEGER,
bar_id INTEGER,
FOREIGN KEY(foo_id) REFERENCES foo(id) ON DELETE CASCADE,
FOREIGN KEY(bar_id) REFERENCES bar(id) ON DELETE CASCADE
);
CREATE INDEX fooindex ON foobar(foo_id);
CREATE INDEX tagindex ON foobar(tag_id);
......但它似乎没有用。我可以从foo
删除一行,但不会影响foobar
。我做错了什么?
答案 0 :(得分:14)
取自本网站,http://www.sqlite.org/foreignkeys.html。
假设在启用外键约束的情况下编译库,应用程序在运行时仍必须使用PRAGMA foreign_keys命令启用它。例如:
sqlite> PRAGMA foreign_keys = ON;
默认情况下禁用外键约束(为了向后兼容),因此必须分别为每个数据库连接单独启用。 (但请注意,SQLite的未来版本可能会更改,以便默认情况下启用外键约束。小心的开发人员不会对默认情况下是否启用外键进行任何假设,而是根据需要启用或禁用它们。)应用程序也可以使用PRAGMA foreign_keys语句来确定当前是否启用了外键。以下命令行会话演示了这一点:
sqlite> PRAGMA foreign_keys;
0
sqlite> PRAGMA foreign_keys = ON;
sqlite> PRAGMA foreign_keys;
1
sqlite> PRAGMA foreign_keys = OFF;
sqlite> PRAGMA foreign_keys;
0
提示:如果命令“PRAGMA foreign_keys”不返回任何数据而不是包含“0”或“1”的单行,那么您使用的SQLite版本不支持外键(因为它大于3.6 .19或因为它是使用SQLITE_OMIT_FOREIGN_KEY或SQLITE_OMIT_TRIGGER定义编译的。)
无法在多语句事务中启用或禁用外键约束(当SQLite未处于自动提交模式时)。试图这样做不会返回错误;它根本没有效果。