MySQL执行CREATE TABLE建表报1064(42000)语法错误的问题排查
报错原因及语法错误汇总
你遇到的1064语法错误由多个问题共同导致,具体错误位置如下:
- 字段/约束定义之间遗漏逗号
这是触发当前报错的直接原因:SQL要求表内的多个字段、约束定义之间必须用英文逗号分隔。你写的actor表中first_name VARCHAR(20) NOT NULL行末尾、middle_name VARCHAR(20)行末尾、last_name VARCHAR(20) NOT NULL行末尾都没有加逗号,SQL无法识别字段分界,因此抛出middle_name附近的语法错误。你删除middle_name、last_name字段后,actor表仅剩余一个字段,不需要字段分隔符,所以可以创建成功,但其余所有表都存在同样的漏写逗号问题,因此下一张表执行时仍会报相同的语法错误。 - 外键定义语法错误
单列外键的字段名必须用括号包裹,你写的FOREIGN KEY tag_name REFERENCES tag(name)不符合规范,正确写法是FOREIGN KEY (tag_name) REFERENCES tag(name),show_tag、show_genre表的外键都存在该问题。 - 依赖表创建顺序错误
你将show表放在建表列表的最后,但show_tag、show_genre、show_actor三张表都通过外键依赖了show表,执行到这三张表时show表还未创建,会触发外键关联错误。需要将show表调整到所有引用它的表之前创建。 - 外键关联字段名不匹配
show_actor表的外键定义写的是REFERENCES actor(fn, ln),但actor表的对应字段名为first_name、last_name,不存在fn、ln字段,关联会失败。 - 关键字冲突(潜在问题)
show是MySQL的保留关键字,用作表名时需要用反引号包裹,避免触发语法冲突。
修正后的代码示例
tables = [""" CREATE TABLE IF NOT EXISTS tag ( name VARCHAR(20) NOT NULL PRIMARY KEY ); """, """ CREATE TABLE IF NOT EXISTS genre ( name VARCHAR(20) NOT NULL PRIMARY KEY ); """, """ CREATE TABLE IF NOT EXISTS actor ( first_name VARCHAR(20) NOT NULL, middle_name VARCHAR(20), last_name VARCHAR(20) NOT NULL, PRIMARY KEY(first_name, last_name) ); """, """ CREATE TABLE IF NOT EXISTS `show` ( title VARCHAR(20) NOT NULL PRIMARY KEY, view_rating VARCHAR(8), release_date DATE, summary TEXT, score DECIMAL(2, 1) ); """, """ CREATE TABLE IF NOT EXISTS show_tag ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, tag_name VARCHAR(20) NOT NULL, show_title VARCHAR(20) NOT NULL, FOREIGN KEY (tag_name) REFERENCES tag(name), FOREIGN KEY (show_title) REFERENCES `show`(title) ); """, """ CREATE TABLE IF NOT EXISTS show_genre ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, genre_name VARCHAR(20) NOT NULL, show_title VARCHAR(20) NOT NULL, FOREIGN KEY (genre_name) REFERENCES genre(name), FOREIGN KEY (show_title) REFERENCES `show`(title) ); """, """ CREATE TABLE IF NOT EXISTS show_actor ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, actor_fn VARCHAR(20) NOT NULL, actor_ln VARCHAR(20) NOT NULL, show_title VARCHAR(20) NOT NULL, FOREIGN KEY (actor_fn, actor_ln) REFERENCES actor(first_name, last_name), FOREIGN KEY (show_title) REFERENCES `show`(title) ); """]
内容的提问来源于stack exchange,提问作者binny
相关产品推荐
相关产品推荐

