Docker环境导入MySQL文件遇#1067错误:updated_at默认值无效
解决MySQL导入错误#1067 - Invalid default value for 'updated_at'
问题根源
报错核心是字段定义冲突:
updated_at字段类型为date,但默认值使用了current_timestamp()- Docker中默认拉取的
mysql镜像是MySQL 8.0+版本,其默认sql_mode包含严格校验规则,不允许date类型使用timestamp类型的默认函数;而XAMPP内置的多为MySQL 5.7版本,默认规则更宽松,因此之前导入无问题。
三种可行解决方案
方案一:修改字段类型(推荐)
将updated_at的类型改为datetime,与reg_date保持一致,这样current_timestamp()默认值可正常生效。修改后的CREATE TABLE语句:
CREATE TABLE `clan` ( `id` int(11) NOT NULL, `server_id` int(11) DEFAULT NULL, `name` varchar(30) NOT NULL, `main_name` varchar(30) NOT NULL, `assist_name` varchar(30) DEFAULT '', `alert` text DEFAULT NULL, `coin` int(11) NOT NULL DEFAULT 0, `level` int(11) NOT NULL DEFAULT 1, `exp` int(11) NOT NULL DEFAULT 0, `box` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, `item_level` int(11) NOT NULL DEFAULT 0, `open_dun` int(11) NOT NULL DEFAULT 1, `use_card` int(11) NOT NULL DEFAULT 1, `reg_date` datetime NOT NULL DEFAULT current_timestamp(), `log` text DEFAULT NULL, `updated_at` datetime NOT NULL DEFAULT current_timestamp(), `than_thu` text DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
方案二:保留date类型,调整默认值
若业务要求updated_at必须为date类型,将默认值改为日期专用函数CURDATE(),修改后的字段定义:
`updated_at` date NOT NULL DEFAULT CURDATE(),
方案三:调整MySQL的sql_mode(临时兼容,不推荐长期使用)
在docker-compose.yaml的mysql服务中添加sql_mode参数,关闭严格日期校验规则:
services: mysql: image: mysql container_name: mysql command: --default-authentication-plugin=mysql_native_password --sql-mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION" restart: always environment: MYSQL_ROOT_PASSWORD: 123456 ports: - "3306:3306" volumes: - game_data:/var/lib/mysql networks: mysql_phpmyadmin: aliases: - mysql # phpmyadmin配置保持不变
修改后重启容器生效:docker-compose down && docker-compose up -d
内容的提问来源于stack exchange,提问作者Nghi La
相关产品推荐
相关产品推荐

