【问题标题】:ON DELETE CASCADE in sqlite3在 sqlite3 中删除级联
【发布时间】:2011-05-04 21:47:59
【问题描述】:

我的结构如下:(对不起,名字尴尬,因为它是我的 iPhone 应用程序的 sqlite 数据库,尚未发布)

CREATE TABLE klb_log (
  id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
  log_comment varchar(512)
)

CREATE TABLE klb_log_food_maps (
  uid integer,
  did integer,
  PRIMARY KEY (uid,did),
  FOREIGN KEY (uid) references klb_log(id) ON DELETE CASCADE,
  FOREIGN KEY (did) references klb_food(id) ON DELETE CASCADE
)

CREATE TABLE klb_food (
  id integer,
  description varchar(255),
  PRIMARY KEY (id)
)

当我删除klb_log 中的一行时,klb_log_food_maps 中的行没有被删除是否有原因?

【问题讨论】:

  • 你解决了吗?即使在运行“PRAGMA foreign_keys = ON”查询之后,我也遇到了同样的问题。
  • @PiotrBlasiak 是的,我在对数据库进行任何查询之前运行它: if (sqlite3_prepare_v2(database, "PRAGMA foreign_keys = ON", -1, &enableForeignKey, NULL) != SQLITE_OK) { NSLog( @"编译指示 DBADAPTER 中的错​​误!"); } sqlite3_finalize(enableForeignKey);并且这是变量: static sqlite3 *database;静态 sqlite3_stmt *enableForeignKey;

标签: sql sqlite


【解决方案1】:

默认情况下,SQLite 不启用外键支持。每次使用 pragma 连接到数据库时都需要手动启用它:

PRAGMA foreign_keys = ON

【讨论】:

  • 您好,我只是将其作为普通查询运行吗?
  • 是的,将其作为普通查询运行。
  • 每次我想要插入、更新和删除记录时还是在创建完整架构时都需要它吗?
  • 我发现我必须在连接到数据库后立即执行 PRAGMA 命令,而不是在每个 DB 命令之前。
  • 每个数据库会话一次(即每次调用 /usr/class/cs145/bin/sqlite 一次)。即使您以前在使用特定数据库时启用了外键约束检查,除非您发出此 PRAGMA 命令,否则与该数据库的新会话将不会检查外键约束。如果您不发出此命令,则允许违反外键约束,并且它将在完全静默中发生。 cs.stanford.edu/people/widom/cs145/sqlite/…
【解决方案2】:

您是否启用了外键支持?

查询PRAGMA foreign_keys = ON; 将其打开

【讨论】:

  • 如果我只是将其作为普通查询运行,那么不幸的是,这并没有帮助。
  • sqlite3_libversion() 给你什么?
  • 您好,抱歉回复晚了。它给了我 3.7.2
猜你喜欢
  • 2013-06-14
  • 2020-05-05
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
  • 2015-04-24
  • 2011-06-29
  • 2010-10-05
  • 2011-09-21
相关资源
最近更新 更多