MySQL的:无法修改或更新日期值的注册列

时间:2018-09-04 12:08:09

标签: mysql

我有两个问题:

  1. 为什么在表定义中将日期设置为不为null时,mysql插入错误的日期0000-00-00时无法通知错误??

示例架构:here

现在,如果将到期日期更改为1970-01-01,则会显示错误

  
    

第1行的Duedate列的日期值0000-00-00不正确

  
update my_list set duedate = '1970-01-01' where duedate = '0000-00-00';

我尝试修改该列,但仍然显示相同的错误

ALTER TABLE `my_list` modify `duedate` date NULL;
ALTER TABLE  `my_list` MODIFY  `duedate` DATE NOT NULL DEFAULT '1970-01-01';
  1. 如何将1970-01-01的截止日期更改为0000-00-00

我从客户端获得了数据库,因此很遗憾地无法处理my.cnf文件。

更多信息:

MYSQL版本:5.5

编辑: 这可以正常工作

update my_list set duedate = '1970-01-01' where id = 16; 

但不是

update my_list set duedate = '1970-01-01' where duedate = '0000-00-00';

3 个答案:

答案 0 :(得分:2)

对字符串的预付日期:

update my_list set duedate = '1970-01-01' where DATE_FORMAT(duedate, '%Y-%m-%d') = '0000-00-00';

答案 1 :(得分:1)

您没有将“修改和更新日期”值启用为“ 0000-00-00”作为虚拟日期。因为MySQL允许您存储“零”值。要禁止使用“ 0000-00-00”,请启用NO_ZERO_DATE SQL模式。

必须启用其他严格模式才能禁止“零”值:

检查版本和SQL模式

SELECT version();
SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session

禁用STRICT_TRANS_TABLES模式

您必须在mysql配置文件中或通过命令禁用STRICT_TRANS_TABLES模式

通过命令

SET sql_mode = '';

SET GLOBAL sql_mode = '';

如果上述方法不起作用,则转到/etc/mysql/my.cnf(根据ubuntu)并注释掉STRICT_TRANS_TABLES

此外,如果要在服务器启动时永久设置sql模式,请在Linux上的my.cnf中包含SET sql_mode =''。对于Windows,必须在my.ini文件中完成。

如果上述方法不起作用,则转到/etc/mysql/my.cnf(根据ubuntu)并注释掉STRICT_TRANS_TABLES

此外,如果要在服务器启动时永久设置sql模式,请在Linux上的my.cnf中包含SET sql_mode =''。对于Windows,必须在my.ini文件中完成。

注意

MySQL允许您将“零”值“ 0000-00-00”存储为“虚拟日期”。在某些情况下,这比使用NULL值更方便,并且使用的数据和索引空间更少。要禁止使用“ 0000-00-00”,请启用NO_ZERO_DATE SQL模式。

关于NO_ZERO_DATE的更新

从5.7.4版开始,不建议使用此模式。请参阅NO_ZERO_DATE的MySQL 5.7文档

答案 2 :(得分:0)

这有效

update my_list
set duedate = '1970-01-01' 
where to_days(duedate)IS NULL

至少在sqlfiddle中