从MySQL日期字段中阻止'0000-00-00'

Dav*_*vid 10 mysql datetime date data-cleaning

我有一个数据库,旧代码喜欢在Date和DateTime列中插入'0000-00-00'而不是实际日期.所以我有以下两个问题:

  1. 有什么我可以在db级别上阻止这个吗?我知道我可以将列设置为非null,但这似乎不会阻止这些零值.
  2. 检测日期字段中现有零值的最佳方法是什么?我有大约一百个表,每个表有2-3个日期列,我不想单独查询它们.

跟进:

默认值已设置为null.很久以前,默认是'0000-00-00'.一些代码仍然明确地放置'0000-00-00'.我宁愿强制该代码抛出错误,以便我可以隔离并删除它.

OMG*_*ies 12

有什么我可以在db级别上阻止这个吗?

是的,启用NO_ZERO_DATE模式:

SET sql_mode = 'NO_ZERO_DATE';
Run Code Online (Sandbox Code Playgroud)

行为记录在案.此外,您可能还想将模式设置为包含NO_ZERO_IN_DATE ...

还要确保sql_mode包含STRICT_ALL_TABLES或STRICT_TRANS_TABLES; 没有这些NO_ZERO_IN_DATE只会发出警告,但插入仍然成功.

检测日期字段中现有零值的最佳方法是什么?我有大约一百个表,每个表有2-3个日期列,我不想单独查询它们.

单独的列意味着它们必须单独检查 - 您无能为力.


Ale*_*all 0

如果其中的日期并不重要(即只要它非零),您可以更改列定义以使用 NOW() 作为默认值。可能不是一个理想的解决方案,但它确实满足标准:1)非空2)非零我实际上并不为这个建议感到自豪