Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 优雅地忽略具有空值的无效日期_Mysql_Sql - Fatal编程技术网

Mysql 优雅地忽略具有空值的无效日期

Mysql 优雅地忽略具有空值的无效日期,mysql,sql,Mysql,Sql,我有一个MySQL数据库。它使用的是MySQL版本5.7,它有一个特性,即sql\u模式设置不包含零日期: 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_ZE

我有一个MySQL数据库。它使用的是MySQL版本5.7,它有一个特性,即
sql\u模式
设置不包含零日期:

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';
更新学生
设置活动时间=空
其中活动时间<'0000-01-01 00:00:00';

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

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

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 ;
分隔符//
在插入前创建触发器
插入前
每排学生人数
开始
如果新活动时间<'0000-01-01 00:00:00',则
设置NEW.activity\u time=NULL;
如果结束;
结束//
定界符;
分隔符//
在更新之前创建触发器
更新前
每排学生人数
开始
如果新活动时间<'0000-01-01 00:00:00',则
设置NEW.activity\u time=NULL;
如果结束;
结束//
定界符;
他们会默默地工作


CHECK constraint(从版本8开始)不允许保存行,但它不会静默工作

您试图运行哪个
ALTER TABLE
命令?@GMB ALTER TABLE students MODIFY COLUMN comments TEXT;通常情况下,您不希望让表像迁移一样改变程序的一部分。您可能希望显式地
NULL
无效日期,以避免所有这些不可靠的检查。请注意,这是针对一组特定的无效日期。是的,它包括已识别的问题日期,但不是所有无效日期的集合。他对所有现有日期运行更新查询,以便oast是安全的,并且将来不会在此列上出现更多ivqalif日期。