2013-02-24 55 views
0

我在sqlite3的做了一个数据库,并在贷款表student表和书籍表中设置外键停止重复贷款:使用创建表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) 

如果我尝试插入重复记录到贷款表外键不会防止它。

Pragma在代码和Firefox数据库设置中均已打开。

的版本是2.6.0

我的工作就是使用鲜明的过滤掉重复的,但有什么办法,我可以激活它们,因为我使用这个数据库作为教学工具。但是cascade delete不起作用!为什么?

回答

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) 
) 
+0

这是我通常会做的,但无法在任何书中找到sql命令! – 2013-02-24 16:51:12

+1

我可以在Sqlite3的2.6.0版本中完美地验证它,因为它已经过实际测试。 – 2013-02-25 02:48:20

0

外键支持仅适用于Sqlite 3.6.19及更高版本。所以问题可能有以下几种:

  1. Sqlite版本< 3.6.19。要确定您的版本是否支持外键或不尝试以下操作:

sqlite> PRAGMA foreign_keys;

如果没有数据返回,而不是或,那么你的版本不支持外键。

  • 你sqlite3的版本与这两种定义
  • SQLITE_OMIT_FOREIGN_KEY的虽然

    SQLITE_OMIT_TRIGGER

    一件事编译,外键没有在sqlite3中强制执行。查找所有这些信息from here