MySQL 5.6触发器填充非空字段插入报错,关闭严格模式仍无效怎么办?
解决MySQL触发器填充NOT NULL列仍报1364错误的问题
这个问题的核心原因是:MySQL的严格模式检查会在BEFORE INSERT触发器执行之前就完成。也就是说,当你执行不带目标列的INSERT语句时,MySQL先检查该列是否有默认值(你设置了NOT NULL且无默认),直接抛出1364错误,根本没轮到触发器去填充值。下面是具体的解决办法:
1. 先确认触发器的有效性
首先要确保你的触发器确实能正确赋值,并且是BEFORE INSERT类型。举个正确的触发器示例:
DELIMITER // CREATE TRIGGER fill_target_column BEFORE INSERT ON your_table_name FOR EACH ROW BEGIN -- 这里替换成你的实际赋值逻辑,比如自动生成ID、获取当前时间等 SET NEW.column_name = UUID(); END // DELIMITER ;
执行下面的命令查看触发器是否存在且状态正常:
SHOW TRIGGERS LIKE 'your_table_name';
2. 彻底关闭严格模式
你之前修改了sql_mode但没生效,可能是因为当前会话的sql_mode没更新,或者还有其他严格模式参数残留。
- 先查看当前全局和会话的
sql_mode:
SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
- 如果输出里还有
STRICT_ALL_TABLES(这也是严格模式的一部分),需要一并移除,执行:
-- 修改全局配置,重启后生效 SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION'; -- 修改当前会话的配置,立即生效 SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';
- 永久生效的话,找到MySQL配置文件(Linux是
/etc/my.cnf或/etc/mysql/my.cnf,Windows是my.ini),添加或修改:
[mysqld] sql_mode = NO_ENGINE_SUBSTITUTION
然后重启MySQL服务。
3. 给列设置临时默认值(无需修改sql_mode)
如果不想关闭严格模式,可以给目标列设置一个“占位”默认值,让MySQL通过初始检查,之后触发器再覆盖这个值。比如:
-- 根据列类型选择合适的默认值,比如字符串用空串,数字用0 ALTER TABLE your_table_name MODIFY COLUMN column_name VARCHAR(255) NOT NULL DEFAULT '';
这样插入时MySQL会先用默认值通过检查,触发器执行时再把值替换成你需要的内容,完美绕过1364错误。
4. 排除插入语句的问题
最后检查你的INSERT语句,有没有显式将该列设为NULL,比如:
INSERT INTO your_table_name (col1, column_name) VALUES ('value1', NULL);
这种情况下哪怕有触发器也会报错,因为显式传入NULL会被严格模式直接拦截,确保插入语句里不包含该列即可。
内容的提问来源于stack exchange,提问作者Mateus Neves
相关产品推荐
相关产品推荐

