mysql - 尝试在创建表查询中创建外键约束时出现 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。
解决方案
正如fancyPants 在评论中回答的那样:
在您的
CREATE TABLE
声明中,在列周围加上括号:FOREIGN KEY (person_id) REFERENCES
推荐阅读
- python - 如何在numpy数组中获取“对角线”以下元素的索引
- nginx - Nginx 代理 - proxy_set_header - 来自 site.conf 的自定义标头(用于 Varnish 缓存)
- javascript - 轮播 onmouseover 和 onmouseout 不起作用
- python - python中这个递归函数的时间复杂度是多少?
- c# - 在 Monogame 中加载没有内容管道的 .FBX 文件
- internationalization - 在页面级组件上声明 namespacesRequired 数组
- javascript - 如何将一组对象组合成数组
- javascript - Discord 机器人角色问题编码
- r - 在 ggplot2 中使用 labeller 更改 facet_wrap 标签
- python - 如何截取特定窗口的屏幕截图?(Python)