我有一个在sqlite3中创建的数据库,并在贷款表上设置了外键到学生表和书籍表以停止重复贷款:
使用创建表格:
CREATE TABLE loan(
SudentID INTEGER,
ISBN INTEGER,
out INTEGER,
FOREIGN KEY(SudentID)
REFERENCES student(SudentID)
ON DELETE CASCADE
FOREIGN KEY(ISBN)
REFERENCES book(ISBN)
ON DELETE CASCADE
)
CREATE TABLE student(
SudentID INTEGER PRIMARY KEY,
First TEXT,
Last,
Contact Text,
Year INTEGER)
CREATE TABLE book(
ISBN INTEGER PRIMARY KEY,
Title TEXT,
Price INTEGER,
Qty INTEGER,
Subject TEXT)
如果我尝试将重复记录插入贷款表,则外键不会阻止它。
在代码和Firefox数据库设置中都启用了Pragma 。
版本为2.6.0
我的工作是使用Distinct过滤掉重复项,但我可以用任何方式激活它们,因为我使用此数据库作为教学工具。但是cascade delete
不起作用!为什么呢?
答案 0 :(得分:1)
您希望贷款表上有复合主键。
CREATE TABLE loan(
StudentID INTEGER,
ISBN INTEGER,
out INTEGER,
FOREIGN KEY(SudentID)
REFERENCES student(SudentID)
ON DELETE CASCADE
FOREIGN KEY(ISBN)
REFERENCES book(ISBN)
ON DELETE CASCADE
PRIMARY KEY(StudentID, ISBN)
)
答案 1 :(得分:0)
外键支持仅适用于Sqlite 3.6.19及更高版本。所以问题可能是以下之一:
源码> PRAGMA foreign_keys;
如果没有数据返回而不是 0 或 1 ,那么您的版本不支持外键。
SQLITE_OMIT_FOREIGN_KEY
SQLITE_OMIT_TRIGGER
但有一点,在sqlite3中没有强制执行外键。查找所有这些信息from here