MySQL5.7下phpMyAdmin导入建表SQL报1064语法错误如何解决?
报错原因
- 核心是MySQL 5.7版本的语法限制导致的:
- MySQL 8.0才开始支持表达式作为列默认值的写法(也就是
DEFAULT (函数/运算)这种括号包裹表达式的格式),5.7版本只允许常量、或者CURRENT_TIMESTAMP这类特殊的时间常量作为默认值,不支持自定义函数运算结果作为默认值。 - 你写的
DEFAULT (TO_BASE64(RANDOM_BYTES(16)))语法不符合5.7的语法规则,所以直接抛出1064语法错误。
- MySQL 8.0才开始支持表达式作为列默认值的写法(也就是
修复方案
有三种方案可选,可根据实际环境选择:
方案1:升级MySQL版本
无需修改现有SQL语句,把MySQL升级到8.0及以上版本,原有建表语句可以直接运行。
方案2:MySQL 5.7环境下修改实现逻辑
步骤1:修改建表语句,去掉id列的默认值配置
CREATE TABLE IF NOT EXISTS `category` ( `id` VARCHAR(32) NOT NULL, `name` VARCHAR(200) NOT NULL, `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), CONSTRAINT `UNIQUE_name` UNIQUE (`name`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
步骤2:实现自动生成id
方式A:插入数据时手动生成id
插入数据的时候主动拼接id生成逻辑即可,示例语句:
INSERT INTO `category` (`id`, `name`) VALUES (TO_BASE64(RANDOM_BYTES(16)), '测试分类');
方式B:添加触发器自动生成id
如果不想修改业务代码的插入逻辑,添加前置插入触发器自动补全id即可,触发器创建语句:
DELIMITER // CREATE TRIGGER before_insert_category BEFORE INSERT ON `category` FOR EACH ROW BEGIN IF NEW.id IS NULL OR NEW.id = '' THEN SET NEW.id = TO_BASE64(RANDOM_BYTES(16)); END IF; END // DELIMITER ;
方案3:简化id生成规则
如果不需要固定使用base64编码的随机字符串作为id,也可以直接将id列改为自增主键,建表语句示例:
CREATE TABLE IF NOT EXISTS `category` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键id', `name` VARCHAR(200) NOT NULL, `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), CONSTRAINT `UNIQUE_name` UNIQUE (`name`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
内容的提问来源于stack exchange,提问作者rosnk
相关产品推荐
相关产品推荐

