我有两个问题:
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';
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';
答案 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中