wes*_*wes 18 sqlite many-to-many relational-database
我正在尝试使用foos和bars 建立一个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);
Run Code Online (Sandbox Code Playgroud)
......但它似乎没有起作用.我可以删除一行foo,但不会影响foobar.我究竟做错了什么?
ace*_*ace 15
摘自本网站http://www.sqlite.org/foreignkeys.html.
假设在使用外键约束的情况下编译库,应用程序必须在运行时使用PRAGMA foreign_keys命令启用它.例如:
sqlite> PRAGMA foreign_keys = ON;
Run Code Online (Sandbox Code Playgroud)
默认情况下禁用外键约束(为了向后兼容),因此必须分别为每个数据库连接单独启用.(但请注意,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
Run Code Online (Sandbox Code Playgroud)
提示:如果命令"PRAGMA foreign_keys"不返回任何数据而不是包含"0"或"1"的单行,则您使用的SQLite版本不支持外键(因为它超过3.6.19或者因为它是用SQLITE_OMIT_FOREIGN_KEY或SQLITE_OMIT_TRIGGER定义编译的).
在多语句事务中(当SQLite未处于自动提交模式时),无法启用或禁用外键约束.试图这样做不会返回错误; 它根本没有效果.
| 归档时间: |
|
| 查看次数: |
16216 次 |
| 最近记录: |