sqlite3外键

时间:2013-02-24 15:00:01

标签: sql sqlite composite-primary-key

我有一个在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不起作用!为什么呢?

2 个答案:

答案 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及更高版本。所以问题可能是以下之一:

  1. Sqlite版本< 3.6.19。无论您的版本是否支持外键,请尝试以下操作:
  2.   

    源码> PRAGMA foreign_keys;

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

    1. 您的sqlite3版本是使用这些定义的
    2. 编译的
        

      SQLITE_OMIT_FOREIGN_KEY

           

      SQLITE_OMIT_TRIGGER

      但有一点,在sqlite3中没有强制执行外键。查找所有这些信息from here