MySQL执行建表SQL时报第25行CREATE TABLE users附近语法错误如何解决
错误产生原因
报错提示的第25行是你提交的SQL脚本中CREATE TABLE users语句的起始行,实际错误根源来自第一张characters表的语法规则冲突,具体有两个核心诱因:
- AUTO_INCREMENT列属性不合法:三张表的主键id都定义为
INT(11) NULL AUTO_INCREMENT,MySQL要求AUTO_INCREMENT修饰的列必须为NOT NULL属性,严格模式下该定义会直接触发语法错误。 - 零值日期默认值非法:
characters表的dob字段默认值设为'0000-00-00'、deletion_date字段默认值设为'0000-00-00 00:00:00',MySQL 5.7及以上版本默认开启NO_ZERO_DATESQL模式,禁止日期/时间类型使用全0值作为默认值,会导致第一张表创建失败,执行到下一条建表语句时抛出错误。
排查修复方案
按以下步骤修改即可正常执行:
- 把三张表的id字段定义统一修改为
INT(11) NOT NULL AUTO_INCREMENT,符合AUTO_INCREMENT列的语法要求。 - 调整
characters表的非法日期默认值,二选一即可:- 方案一(推荐):替换为合法日期值,比如
dob默认值改为'1970-01-01',deletion_date默认值改为'1970-01-01 00:00:00';如果业务允许,也可以将字段设为允许NULL,默认值改为NULL。 - 方案二(兼容旧业务):建表前先执行
SET sql_mode = '';临时关闭当前会话的严格模式和零日期限制,建表完成后再恢复原有SQL模式即可。
- 方案一(推荐):替换为合法日期值,比如
修复后的完整SQL示例:
CREATE TABLE `characters` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `owner` VARCHAR(50) DEFAULT NULL, `first_name` VARCHAR(50) NOT NULL DEFAULT 'John', `last_name` VARCHAR(50) NOT NULL DEFAULT 'Doe', `date_created` TIMESTAMP NOT NULL DEFAULT current_timestamp(), `cash` INT(9) DEFAULT 500, `bank` INT(9) NOT NULL DEFAULT 5000, `phone_number` BIGINT(11) NOT NULL DEFAULT 0, `dob` DATE NOT NULL DEFAULT '1970-01-01', `story` TEXT NOT NULL, `new` INT(1) NOT NULL DEFAULT 1, `deleted` INT(11) NOT NULL DEFAULT 0, `deletion_date` TIMESTAMP NOT NULL DEFAULT '1970-01-01 00:00:00', `gender` INT(1) NOT NULL DEFAULT 0, `jail_time` INT(11) NOT NULL DEFAULT 0, `dirty_money` INT(11) NOT NULL DEFAULT 0, `gang_type` INT(11) NOT NULL DEFAULT 0, `jail_time_mobster` INT(11) NOT NULL DEFAULT 0, `judge_type` INT(11) NOT NULL DEFAULT 0, `iswjob` INT(11) NOT NULL DEFAULT 0, PRIMARY KEY (id) ); CREATE TABLE `users` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `hex_id` VARCHAR(100) DEFAULT NULL, `steam_id` VARCHAR(50) DEFAULT NULL, `community_id` VARCHAR(100) DEFAULT NULL, `license` VARCHAR(255) DEFAULT NULL, `name` VARCHAR(255) NOT NULL DEFAULT 'Uknown', `ip` VARCHAR(50) NOT NULL DEFAULT 'Uknown', `rank` VARCHAR(50) NOT NULL DEFAULT 'user', `date_created` TIMESTAMP NOT NULL DEFAULT current_timestamp(), PRIMARY KEY (id) ); CREATE TABLE `users_whitelist` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `steam_id` VARCHAR(50) DEFAULT NULL, `power` INT(11) NOT NULL DEFAULT 0, `admin_name` TEXT NOT NULL, `user_name` TEXT NOT NULL, `user_ip` TEXT NOT NULL, PRIMARY KEY (id) );
内容的提问来源于stack exchange,提问作者IMRP SERVER
相关产品推荐
相关产品推荐

