SQLite附近语法错误

4
我是一名新手,正在学习 SQL,并尝试创建一个包含对另一个表的外键引用的表格。但我一直收到“语法错误”的提示,却不知道原因。以下是 SQL 语句,请帮我检查一下。
第一个表格:
sqlite> CREATE TABLE nl_central_teams ( 

   ...>  id INTEGER PRIMARY KEY AUTOINCREMENT,

   ...>  team_name VARCHAR(64) NOT NULL,

   ...>  city VARCHAR(64) NOT NULL,

   ...>  main_color VARCAR(64) NOT NULL,

   ...>  created_at DATETIME NOT NULL,

   ...> updated_at DATETIME NOT NULL

   ...> );

第一个表格正常工作。

第二个表格

sqlite> CREATE TABLE managers(

   ...> id INTEGER PRIMARY KEY AUTOINCREMENT,

   ...> first_name VARCHAR(64) NOT NULL,

   ...> last_name VARCHAR(64) NOT NULL,

   ...> team_id INTEGER,

   ...> FOREIGN KEY(team_id) REFERENCES nl_central_teams(id),

   ...> created_at DATETIME NOT NULL,

   ...> updated_at DATETIME NOT NULL

   ...> );

错误:在"created_at"附近:语法错误

我觉得我的语法是正确的,但是无法弄清楚为什么会出现这个错误。任何帮助将不胜感激。


这是MySQL还是SQLite? - tadman
2个回答

7

外键约束应该放在CREATE TABLE定义的末尾。

你的管理人员的CREATE TABLE语句应该像这样:

CREATE TABLE managers(
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    first_name VARCHAR(64) NOT NULL,
    last_name VARCHAR(64) NOT NULL,
    team_id INTEGER,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NOT NULL,
    FOREIGN KEY(team_id) REFERENCES nl_central_teams(id)
);

看这里:http://sqlfiddle.com/#!7/f3f38/1/0

0
问题出在你错误引用上面的那一行: FOREIGN KEY(team_id) REFERENCES nl_central_teams(id), SQLite中的外键支持有点棘手。它可能由于以下原因之一而无法正常工作:
  1. 您使用的版本早于引入外键支持的3.6.9版本。
  2. 您使用的是3.6.9或更高版本,但您的特定安装未编译支持外键约束,这是可能的。(请参见http://www.sqlite.org/foreignkeys.html#fk_enable

    为了在SQLite中使用外键约束,必须编译库时未定义SQLITE_OMIT_FOREIGN_KEY或SQLITE_OMIT_TRIGGER。如果定义了SQLITE_OMIT_TRIGGER但未定义SQLITE_OMIT_FOREIGN_KEY,则SQLite的行为与3.6.19版本之前相同-可以解析外键定义,并且可以使用PRAGMA foreign_key_list查询,但不强制执行外键约束。

  3. 您的安装支持外键约束,但尚未启用。 (请参见http://www.sqlite.org/faq.html#q22。)

    从3.6.19版本开始,SQLite支持外键约束。但是,默认情况下关闭外键约束的执行(为了向后兼容)。要启用外键约束执行,请运行PRAGMA foreign_keys = ON或使用-DSQLITE_DEFAULT_FOREIGN_KEYS = 1进行编译。


1
这三个原因都不适用于这个特定的问题。Donal得到了正确的答案。 - Tianyun Ling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接