【问题标题】:sqlite3 foreign keysqlite3 外键
【发布时间】:2013-02-09 18:30:16
【问题描述】:

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

【问题讨论】:

    标签: sql sqlite composite-primary-key


    【解决方案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)
    )
    

    【讨论】:

    • 这是我通常会做的,但在任何书籍中都找不到sql命令!
    • 我可以验证它在 Sqlite3 的 2.6.0 版本中完美运行,因为它已经过实际测试。
    【解决方案2】:

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

    1. Sqlite 版本

    sqlite> PRAGMA foreign_keys;

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

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

    SQLITE_OMIT_FOREIGN_KEY

    SQLITE_OMIT_TRIGGER

    但有一件事,在 sqlite3 中不强制执行外键。找到所有这些信息from here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-12
      • 1970-01-01
      • 2013-03-04
      • 2011-09-11
      • 2013-02-24
      • 1970-01-01
      • 2012-04-13
      相关资源
      最近更新 更多