0

我有一个在 sqlite3 中创建的数据库,并将外键设置为 student 表和 book 表以停止重复贷款:

使用创建表

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

我的解决方法是使用 Distinct 过滤掉重复项,但是当我将此数据库用作教学工具时,有什么方法可以激活它们。但是cascade delete不起作用!为什么?

4

2 回答 2

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)
)
于 2013-02-24T15:30:28.090 回答
0

外键支持仅在 Sqlite 3.6.19 及更高版本中可用。所以问题可能是以下之一:

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

sqlite> PRAGMA 外键;

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

  1. 您的 sqlite3 版本是使用这些定义的任何一个编译的

SQLITE_OMIT_FOREIGN_KEY

SQLITE_OMIT_TRIGGER

不过有一件事,在 sqlite3 中没有强制执行外键。从这里找到所有这些信息

于 2016-03-05T18:18:21.510 回答