mysql - 优雅地忽略具有 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 命令始终继续工作?
解决方案
我看到的唯一机会是使用触发器,在插入和更新之前检查
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 起)不允许保存该行,但它不会静默工作
推荐阅读
- tensorflow - tf.data OutOfRangeError(参见上面的回溯):序列结束
- gremlin - Gremlin:生成笛卡尔积
- php - 在php中更改页面时安全地保留用户的哈希
- python-3.x - 为什么抓取检测只有 20 个 img 标签?
- javascript - 数据表 - 表隐藏列和顺序
- python-3.x - 在哪里可以找到使用 pycrypto 创建的 PEM 文件
- angular - Angular 6 + Java spring boot:一旦部署的角度路由器无法重新加载页面(刷新)
- git - Azure Devops 构建能否仅获取路径筛选器涵盖的源文件?
- javascript - 带有 HTTP 基本身份验证的 Angular 6 HTTP Get 请求
- sh - 我想删除所有括号值