创建MySQL users表遇#1064语法错误,咨询原因及规避方法
问题原因及解决方案
错误原因
你的SQL语法错误出在id字段的约束声明顺序上。在MySQL中,字段约束的声明有固定顺序:NOT NULL需要放在PRIMARY KEY之前,同时AUTO_INCREMENT必须依附于PRIMARY KEY或UNIQUE约束。你当前写的id int PRIMARY KEY NOT NULL AUTO_INCREMENT违反了这个语法规则,导致数据库无法正确解析语句。
修正后的SQL脚本
以下两种写法都可以正常执行:
写法一:调整字段约束顺序
CREATE TABLE `users` ( `id` int NOT NULL AUTO_INCREMENT PRIMARY KEY, `user_role_id` int NOT NULL, `first_name` varchar(250) NOT NULL, `last_name` varchar(250) NOT NULL, `name` varchar(250), `email` varchar(250) NOT NULL, `dni_type` varchar(32) NOT NULL, `dni` int NOT NULL, `phone` int, `address` varchar(250), `city` varchar(125), `state` varchar(125), `country` varchar(32), `zip` varchar(32), `created_at` datetime, `created_by` int, `updated_at` datetime, `updated_by` int, `deleted_at` datetime, `deleted_by` int );
写法二:将主键设为表级约束(更清晰)
CREATE TABLE `users` ( `id` int NOT NULL AUTO_INCREMENT, `user_role_id` int NOT NULL, `first_name` varchar(250) NOT NULL, `last_name` varchar(250) NOT NULL, `name` varchar(250), `email` varchar(250) NOT NULL, `dni_type` varchar(32) NOT NULL, `dni` int NOT NULL, `phone` int, `address` varchar(250), `city` varchar(125), `state` varchar(125), `country` varchar(32), `zip` varchar(32), `created_at` datetime, `created_by` int, `updated_at` datetime, `updated_by` int, `deleted_at` datetime, `deleted_by` int, PRIMARY KEY (`id`) );
未来避免此类问题的方法
- 严格遵循MySQL字段定义的语法顺序:常规顺序为
字段名 数据类型 [NOT NULL | NULL] [DEFAULT 默认值] [AUTO_INCREMENT] [PRIMARY KEY | UNIQUE],或者将主键、外键等约束单独作为表级约束声明,这种方式更不容易出错。 - 写完SQL后,先用语法校验工具(比如MySQL Workbench的内置校验功能)检查语句,再执行。
- 记住自增字段的硬性要求:MySQL中
AUTO_INCREMENT必须搭配PRIMARY KEY或UNIQUE约束,且约束顺序不能乱。
内容的提问来源于stack exchange,提问作者Juan David Polo
相关产品推荐
相关产品推荐

