MySQL 8可为空字段datum_aenderung更新时非空报错排查
问题
执行以下MySQL 8 UPDATE语句:
UPDATE katalog SET katalog_status_id = '1', lieferantennr = '510181', artikelnummer = '12345678', artikelbeschreibung = 'dgdfgdfgdfg', artikelbeschreibung_en = '', kommentar = 'test test ', kategorie_a = '910', kategorie_b = '270', datum_aenderung = '2023-06-15 14:30:42' WHERE catalog_id = '21302'
收到错误提示:
[2023-06-15 14:32:10] [23000][1048] Column 'datum_aenderung' cannot be null
已知datum_aenderung字段设置为允许NULL,且数据库中已有该字段为NULL的记录,排除框架问题(直接在PhpStorm控制台执行仍报错),询问忽略了什么问题。
排查方向与解决方法
- 检查表上的触发器:若
katalog表存在BEFORE UPDATE触发器,可能在更新时强制将datum_aenderung设为NULL或触发非空校验。执行SHOW TRIGGERS LIKE 'katalog';查看触发器定义。 - 确认字段的真实约束:不要仅依赖直观的NULL允许设置,执行
SHOW CREATE TABLE katalog;查看datum_aenderung的完整字段定义,排查是否存在遗漏的NOT NULL约束,或是关联了非空的外键、检查约束。 - 排查SQL赋值的隐性问题:确认
datum_aenderung的赋值字符串是否包含不可见字符,导致MySQL解析为NULL。尝试用STR_TO_DATE('2023-06-15 14:30:42', '%Y-%m-%d %H:%i:%s')明确转换为日期类型后赋值测试。 - 验证目标记录的当前状态:执行
SELECT datum_aenderung FROM katalog WHERE catalog_id = '21302';,确认目标记录的该字段是否存在异常值,比如特殊格式的NULL或无效数据。 - 检查SQL模式的严格性:MySQL 8的
sql_mode若包含STRICT_TRANS_TABLES或STRICT_ALL_TABLES,可能对隐性NULL场景触发报错。执行SELECT @@sql_mode;查看当前模式,可临时关闭严格模式进行排查测试。
内容的提问来源于stack exchange,提问作者Calamity Jane
相关产品推荐
相关产品推荐

