报错“This function has none of DETERMINISTIC…”是因MySQL 5.7+默认log_bin_trust_function_creators=OFF,要求函数/触发器必须声明DETERMINISTIC、NO SQL或READS SQL DATA;解决方法包括临时启用该参数(SET GLOBAL log_bin_trust_function_creators = 1)或手动补全声明,并注意phpMyAdmin导入时的执行顺序、库上下文及系统表mysql.proc完整性。
MySQL导入触发器报错:This function has none of DETERMINISTIC...
这是 mysql 5.7+ 默认开启 log_bin_trust_function_creators=off 导致的。旧版 phpmyadmin 导出的函数/触发器定义里没加 deterministic、no sql 或 reads sql data 声明,mysql 拒绝创建。
实操建议:
- 临时允许不声明特性(仅限导入阶段):
SET GLOBAL log_bin_trust_function_creators = 1;,导入完再设回0 - 手动补全声明:打开导出的 SQL 文件,找到
CREATE FUNCTION或CREATE TRIGGER语句,在AS前加上DETERMINISTIC(若函数不读写数据)或READS SQL DATA(若只读) - 确认用户有
SUPER权限——否则SET GLOBAL会报错
phpMyAdmin里触发器导入后不生效?检查是否被跳过
phpMyAdmin 的「导入」功能默认只执行 CREATE TABLE、INSERT 类语句,对 CREATE TRIGGER 不做特殊处理,但也不会报错跳过——它真会执行,只是容易被忽略。
常见问题:
- SQL 文件里触发器定义在
USE database_name;之前,导致创建到错误库下 - 触发器名已存在,而文件没加
DROP TRIGGER IF EXISTS,新定义被静默忽略 - 目标表不存在,触发器创建失败但 phpMyAdmin 不显示错误(只在「部分 SQL 语句执行失败」提示里埋着)
验证方式:导入后立刻执行 SHOW TRIGGERS LIKE 'table_name';,看结果是否为空
立即学习“PHP免费学习笔记(深入)”;
想跳过触发器执行?MySQL 没有会话级禁用语法
别信网上搜到的 SET SQL_LOG_BIN = 0 或 DISABLE KEYS,它们都不影响触发器执行。MySQL 就是不提供临时关闭触发器的机制。
唯一可靠做法是「删→插→重建」:
- 导入前,用
SHOW CREATE TRIGGER trigger_name;把定义复制保存 - 执行
DROP TRIGGER IF EXISTS trigger_name; - 做
LOAD DATA INFILE或大批量INSERT - 再执行原
CREATE TRIGGER语句(注意权限:需TRIGGER权限)
这步必须人工操作,phpMyAdmin 界面不支持自动编排
导入后触发器报错:Can't open table mysql.proc
这不是触发器本身问题,而是 MySQL 的系统表损坏或缺失。触发器依赖 mysql.proc 存储函数/过程元数据,而该表在升级或异常关机后可能未初始化。
修复命令(需 root 权限):
-
mysql_upgrade -u root -p—— 这会重建mysql库下的所有系统表 - 重启 MySQL:
systemctl restart mysql(宝塔面板点「重启服务」也行) - 再试
SHOW TRIGGERS;,如果仍报错,说明mysql.proc表结构损坏,得从同版本 MySQL 安装包里重新导入该表定义
这个环节最容易被跳过——看到触发器报错第一反应总在 SQL 写法上找问题,其实根源在底层系统表



















