首页 > 解决方案 > 优雅地忽略具有 NULL 值的无效日期

问题描述

我有一个 MySQL 数据库。它使用 MySQL 5.7 版,该版本具有sql_mode设置包括 NO_ZERO_DATE 的功能:

SHOW VARIABLES LIKE 'sql_mode'\G;
*************************** 1. row ***************************
Variable_name: sql_mode
        Value: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

在其中一个表中插入了一个无效的日期,这导致 ALTER TABLE 无法工作。无效日期:

+---------------------+
| activity_time       |
+---------------------+
| 0000-00-00 00:00:00 |

我通过手动执行此操作解决了该问题:

 UPDATE students 
 SET activity_time = NULL
 WHERE activity_time < '0000-01-01 00:00:00';

但是如何配置表以静默地将无效日期转换为 NULL,以便 ALTER TABLE 命令始终继续工作?

标签: mysqlsql

解决方案


我看到的唯一机会是使用触发器,在插入和更新之前检查

DELIMITER //
CREATE TRIGGER before_students_insert
BEFORE INSERT
ON students FOR EACH ROW
BEGIN 
    IF NEW.activity_time < '0000-01-01 00:00:00' THEN
        SET NEW.activity_time = NULL;
    END IF;
END //
DELIMITER ;


DELIMITER //
CREATE TRIGGER before_students_update
BEFORE UPDATE
ON students FOR EACH ROW
BEGIN 
    IF NEW.activity_time < '0000-01-01 00:00:00' THEN
        SET NEW.activity_time = NULL;
    END IF;
END //
DELIMITER ;

这会默默地工作。

CHECK Constarint(自版本 8 起)不允许保存该行,但它不会静默工作


推荐阅读