如何在swift sqlite3中创建外键?

ohtdti5x  于 2022-11-30  发布在  SQLite
关注(0)|答案(1)|浏览(152)

我试图通过import sqlite3使用swift/xCode中的默认sqlite3库创建一个包含外键的sqlite表。创建的表没有键,但如果我将外键添加到语句中,就会出现语法错误。
错误:[日志记录]靠近“日期”:语法错误

"""
        CREATE TABLE IF NOT EXISTS measurement(
          measurementid         INTEGER     PRIMARY KEY AUTOINCREMENT   NOT NULL,
          accountid             INTEGER                                 NOT NULL,
            FOREIGN KEY(accountid) REFERENCES accounts(userid),
          date                  TEXT                                    NOT NULL,
          measurementtype       TEXT                                    NOT NULL,
          moodmeasurementid     INTEGER,
          healthmeasurementid   INTEGER,
          bodymeasurementid     INTEGER,
          workout               TEXT                                    NOT NULL
        );
"""

"""
        CREATE TABLE IF NOT EXISTS accounts(
            userid          INTEGER PRIMARY KEY AUTOINCREMENT   NOT NULL,
            email           TEXT                                NOT NULL,
            password        TEXT                                NOT NULL,
            firstname       TEXT                                NOT NULL,
            lastname        TEXT                                NOT NULL,
            birthday        TEXT                                NOT NULL,
            gender          TEXT                                NOT NULL,
            creationdate    TEXT                                NOT NULL
        );
        """

经过一些研究,我读到,你可能需要激活外键,在使用它们之前。所以我添加了下面的代码,但我仍然得到同样的错误。

if sqlite3_exec(dbPointer, "PRAGMA foreign_keys = ON", nil, nil, nil) != SQLITE_OK {
            let err = String(cString: sqlite3_errmsg(dbPointer))
                print("error attempting to enable foreign keys: \(err)")
            }

另外,将它添加到语句的末尾也没有解决这个问题。

a9wyjsp7

a9wyjsp71#

您使用的是表约束语法,而不是列约束语法。
您需要:

accountid             INTEGER                                 NOT NULL
  REFERENCES accounts(userid),

如果要将约束条件添加到表中,则需要使用FOREIGN KEY(accountid)。还要注意删除了NOT NULL后面的逗号。
有关语法的完整详细信息,请参见https://www.sqlite.org/lang_createtable.html

相关问题