error 1067/1138本质是mysql 8.0严格模式拒绝5.7隐式默认值,临时方案为导入前执行set session sql_mode='no_engine_substitution',根治需在5.7提前为not null字段添加显式默认值如default current_timestamp。

mysqldump导入时ERROR 1067 / 1138怎么修
这类报错本质是 MySQL 8.0 的 STRICT_TRANS_TABLES 模式拒绝隐式默认值,而 5.7 默认允许 '0000-00-00' 或 NULL 插入 NOT NULL 字段。
- 临时绕过:导入前执行
SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';(不推荐长期用) - 根治方案:导出时加
--skip-extended-insert,再用 sed 或脚本批量补默认值,例如把INSERT INTO t (a,b) VALUES (1,);改成INSERT INTO t (a,b) VALUES (1,'1970-01-01'); - 更稳妥做法:升级前在 5.7 上先运行
ALTER TABLE t MODIFY created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;,让字段显式带默认值
CREATE USER 和 mysql.user 表插入语句为何必删
phpMyAdmin 导出的 SQL 常含 INSERT INTO `mysql`.`user` 或 CREATE USER ... IDENTIFIED BY,这些在 8.0 上直接执行会失败——系统表结构和认证逻辑已变。
-
CREATE USER 'u'@'%' IDENTIFIED BY 'p';→ 必须改为CREATE USER 'u'@'%' IDENTIFIED WITH mysql_native_password BY 'p';(若客户端不支持caching_sha2_password) - 所有以
INSERT INTO `mysql`.开头的语句必须整行删除,包括INSERT INTO mysql.db、mysql.tables_priv等——系统库严禁导入 - 导出后检查是否有
SET @@sql_mode=行,尤其含NO_AUTO_CREATE_USER的,整行删掉(8.0 已移除该模式)
GROUP BY 报 ERROR 1055 别急着关 ONLY_FULL_GROUP_BY
这不是语法错误,是 8.0 默认启用 ONLY_FULL_GROUP_BY 后对查询逻辑的强制校验:SELECT 列表里每个非聚合字段都得出现在 GROUP BY 中,或用 ANY_VALUE() 显式包裹。
- 查当前模式:
SELECT @@sql_mode;,确认是否含ONLY_FULL_GROUP_BY - 临时修复(仅当前连接):
SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); - 长期方案:改 SQL,比如
SELECT id, name, COUNT(*) FROM t GROUP BY id;→ 改为SELECT id, ANY_VALUE(name), COUNT(*) FROM t GROUP BY id; - 别在
my.cnf里全局删掉ONLY_FULL_GROUP_BY,掩盖问题比修复更危险
视图里子查询和窗口函数怎么兼容
MySQL 8.0 不允许视图定义中出现 FROM 子句里的子查询(ERROR 1349),也不接受无 ORDER BY 的窗口函数(ERROR 3586)。
-
CREATE VIEW v AS SELECT * FROM (SELECT a FROM t) s;→ 改成CREATE VIEW v AS SELECT a FROM t;或用 CTE:CREATE VIEW v AS WITH s AS (SELECT a FROM t) SELECT * FROM s; - 窗口函数必须带
ORDER BY,ROW_NUMBER() OVER ()非法,得写成ROW_NUMBER() OVER (ORDER BY id) -
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW在 8.0 视图中不支持,统一换为ROWS框架 - 标量子查询如
(SELECT COUNT(*) FROM x WHERE y = v.id)不能直接写在 SELECT 列表,得改 LEFT JOIN + 子查询聚合
真正卡住人的不是某条命令不会敲,而是改完 SQL 还报错时,不知道该去查 mysql.user.plugin 字段值,还是看 SHOW FULL COLUMNS 的 Collation,抑或翻 upgrade.log 最后三行——这些点不在同一层,但缺一不可。











