首页 > 解决方案 > 尝试在创建表查询中创建外键约束时出现 SQL 语法错误 1064

问题描述

我正在尝试使用以下查询创建两个表:

DROP TABLE IF EXISTS person;
CREATE TABLE person (
    PRIMARY KEY (person_id),
    person_id INT NOT NULL AUTO_INCREMENT
)
ENGINE InnoDB CHARSET utf8 COLLATE utf8_unicode_ci
COMMENT "A list of people.";

DROP TABLE IF EXISTS logon;
CREATE TABLE logon (
    PRIMARY KEY (logon_id),
    logon_id  INT NOT NULL AUTO_INCREMENT,
    person_id INT NOT NULL,
              UNIQUE INDEX person_id (person_id),
              CONSTRAINT fk_logon_has_person
              FOREIGN KEY person_id REFERENCES person (person_id)
              ON UPDATE CASCADE
              ON DELETE RESTRICT,
    passwd    CHAR(60) NOT NULL
)
ENGINE InnoDB CHARSET utf8 COLLATE utf8_unicode_ci
COMMENT "Available logins for people.";

在 HeidiSQL 上运行这个查询会给我这个错误:

/* SQL Error (1064): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'REFERENCES person (person_id)
              ON UPDATE CASCADE
              ON' at line 7 */

我完全删除了外键约束部分,查询执行得很好。
然后我在 HeidiSQL 中手动添加了外键,生成了这个查询:

ALTER TABLE `logon` ADD CONSTRAINT `fk_logon_has_person` FOREIGN KEY (`person_id`) REFERENCES `playground`.`person` (`person_id`) ON UPDATE CASCADE ON DELETE RESTRICT;

我试图用它的语法替换我的创建表查询的约束(从 ADD 开始,用`s),但错误仍然出现。
我还尝试删除 ON UPDATE/DELETE 部分,并将登录表的 person_id 列名称更改为其他名称,以便它与 person 表的列没有歧义,但没有运气。
我查看了MariaDB 的文档,语法对我来说是正确的。现在我不知道为什么这不起作用。
有任何想法吗?

我正在使用 MariaDB v10.4.12 和 HeidiSQL v11.0.0.5919。

标签: mysqlmariadb

解决方案


正如fancyPants 在评论中回答的那样:

在您的CREATE TABLE声明中,在列周围加上括号:FOREIGN KEY (person_id) REFERENCES


推荐阅读