SQL转MariaDB执行建表语句外键约束报错相关问题咨询
问题解答
问题1:原语句中KEY fk_book _author_id (author_id )的作用是什么?是否仅用于定义约束?
- 这条语句的作用是在
author_id字段上创建普通索引,KEY是MariaDB/MySQL中INDEX的同义词,两者功能完全等价。 - 它不用于定义约束,外键才属于约束范畴,创建这个索引的作用主要是加速外键校验、以及后续
author_id字段的关联查询、筛选操作。 - 注意原句这里存在低级错误:索引名
fk_book _author_id中间夹带了多余空格,字段名author_id后面也多了空格,属于非法的标识符定义。
问题2:上述KEY语法是否可以在MariaDB脚本中正常使用?
- 完全可以,
KEY创建普通索引是MariaDB原生支持的合法语法,不存在兼容问题。 - 你原句报错和
KEY语法本身无关,是因为你写的标识符夹带多余空格、还有其他语法疏漏导致的。比如去掉多余空格写成KEYfk_book_author_id(author_id)就可以正常运行。
问题3:原第一段建表语句是否可以在MariaDB中一次性执行成功?
- 修复错误后可以一次性执行成功,你原来报错的原因不是「建表同时加外键」的逻辑不支持,是原句存在多个可修复的错误:
- 索引名、字段名中夹带多余空格,属于标识符语法错误
CONSTRAINTfk_book_authorFOREIGN KEY这里约束名和FOREIGN KEY关键字之间缺少空格,导致语法解析失败- 额外需要确认前提:
author表必须提前存在,且author.id的字段类型必须和book.author_id完全一致(必须是SMALLINT UNSIGNED类型,属性不能有差异)
- 另外你拆分后的脚本存在逻辑冗余:建表语句里已经定义了外键约束,后面
ALTER又加了一次同名的外键,正常运行会报重复约束错误,你能跑通大概率是建表时的外键定义因为前面的语法错误没有实际生效。
内容的提问来源于stack exchange,提问作者John D
相关产品推荐
相关产品推荐

