创建表时添加外键约束触发SQL语法错误1064的求助
解决MariaDB创建带外键的表时的语法错误问题
首先咱们先揪出你原SQL语句里的核心语法错误——在定义外键约束时,你没有把外键列名用括号包裹起来!MariaDB/MySQL明确要求,FOREIGN KEY关键字后面必须跟括号包裹的列名,哪怕只有单个列。
你原来的错误写法:
CONSTRAINT fk_logon_has_person FOREIGN KEY person_id REFERENCES person (person_id)
正确的写法应该给person_id加上括号:
CONSTRAINT fk_logon_has_person FOREIGN KEY (person_id) REFERENCES person (person_id)
修正后的完整CREATE TABLE语句
我把语句做了排版优化(更易读,也避免紧凑语法导致的识别问题),你可以直接执行:
DROP TABLE IF EXISTS person; CREATE TABLE person ( person_id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (person_id) ) ENGINE InnoDB CHARSET utf8 COLLATE utf8_unicode_ci COMMENT "A list of people."; DROP TABLE IF EXISTS logon; CREATE TABLE logon ( logon_id INT NOT NULL AUTO_INCREMENT, person_id INT NOT NULL, passwd CHAR(60) NOT NULL, PRIMARY KEY (logon_id), 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 ) ENGINE InnoDB CHARSET utf8 COLLATE utf8_unicode_ci COMMENT "Available logins for people.";
额外排查建议
如果执行修正后的语句仍有问题,可以检查这几点:
- 确认HeidiSQL的语句分隔符设置(默认是
;),如果多语句执行异常,可以拆分两步:先创建person表,再创建logon表; - 如果你当前会话没切换到目标数据库,可以显式指定库名,比如把
REFERENCES person (person_id)改成REFERENCES playground.person (person_id),和你手动加外键的语句保持一致; - 验证当前数据库用户是否拥有创建外键的权限;
- 虽然不影响当前报错,但MariaDB 10.4+推荐用
utf8mb4替代utf8,以支持完整的Unicode字符(比如emoji)。
内容的提问来源于stack exchange,提问作者Antti L.
相关产品推荐
相关产品推荐

