【问题标题】:SQLite - Foreign Keys Contraints - IOs 5SQLite - 外键约束 - IOs 5
【发布时间】:2012-02-03 11:24:03
【问题描述】:

似乎从 SQLite 版本 3.6.x 开始支持外键约束。 IOS5.0上的SQLite版本是3.7.7(在sqlite3.h中找到)。

但是当我尝试在有约束的表中插入一行时,即使相关的外键不存在,我的行也会正确插入。我没有错误。

使用像 Navicat 这样的应用程序执行相同的插入语句会给我一个“约束违反错误”

你知道 IOs 5 是否支持外键吗?

这是数据库架构:

CREATE TABLE artist(
  artistid    INTEGER PRIMARY KEY, 
  artistname  TEXT
)

CREATE TABLE "track" (
     "trackid" INTEGER PRIMARY KEY AUTOINCREMENT,
     "trackname" TEXT,
     "trackartist" INTEGER,
    CONSTRAINT "trackartist" FOREIGN KEY ("trackartist") REFERENCES "artist" ("artistid") ON DELETE CASCADE ON UPDATE CASCADE)

真的很简单,不是吗?

谢谢 伊曼纽尔

【问题讨论】:

  • 你能把你要插入表格的代码贴出来吗?
  • 嗨,我用的是FMDatabase,代码很简单:[db executeUpdate:@"insert into track (trackname,trackartist) values (?,?)" , @"new track", [NSNumber numberWithInt:i]]
  • 奇怪...我和你有完全相同的场景...(Navicat,iOS,FMDB)。同样的问题。一定很喜欢。

标签: ios sqlite key


【解决方案1】:

它在文档上: SQLite Doc

当你打开连接时:

[database executeUpdate:@"PRAGMA foreign_keys=ON"];

【讨论】:

    【解决方案2】:

    这就是我使用FMDB 的方式:

    [database executeUpdate:@"PRAGMA foreign_keys=ON"];
    

    【讨论】:

      【解决方案3】:

      我终于找到了解决方案……而且你说得对。

      默认情况下,sqlite 数据库在禁用外键选项的情况下打开,即使表是使用外键约束构建的!

      所以只需提出这个简单的请求:

      PRAGMA foreign_keys=ON;
      

      在打开数据库之后,在事务之外(如果您使用 fmdatabase 和事务功能)

      希望这对其他人有所帮助。

      伊曼纽尔

      【讨论】:

        【解决方案4】:

        默认情况下禁用外键。您必须为每个连接单独启用它们。该设置不是“粘性”。每次连接到 SQLite 数据库时都必须这样做。

        PRAGMA foreign_keys = ON;
        

        Navicat 很可能会为你处理这些问题。在您自己的代码中,这是您的工作。

        【讨论】:

        • 这很好,但我该怎么做呢?我只是将其执行到数据库吗?我如何使用这PRAGMA foreign_keys = ON 行代码?
        • @Daniel:是的,你执行它就像它是一条 SQL 语句一样。 Details on SQLite's C interface
        猜你喜欢
        • 2014-01-17
        • 2013-05-03
        • 2020-10-18
        • 2011-05-14
        • 2015-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多