如何阻止'0000-00-00 00:00:00'日期值进入我的MySQL表?

时间:2014-04-29 21:25:10

标签: mysql sql date datetime

我在OS X 10.9.1上使用MySQL 5.5.37。我有一个类型为NOT NULL的{​​{1}}列。在不使用触发器的情况下,如何阻止00:00:00&00; 00进入我的专栏?我接受CURRENT_TIMESTAMP的值代替所有的零。

我试过了:

DATETIME

运行上面的内容后,我仍然可以在表格中插入零日期。

3 个答案:

答案 0 :(得分:5)

不使用触发器(您声明的条件),您不能。但是,根据the MySQL documentation

NO_ZERO_DATE模式会影响服务器是否允许'0000-00-00'作为有效日期。 其效果还取决于是否启用了严格SQL模式。

  • 如果此模式未启用,则允许使用'0000-00-00'并且插入不会产生警告。

  • 如果此模式 启用,则允许使用'0000-00-00'并且插入会产生警告。

  • 如果启用此模式和严格模式,则不允许使用'0000-00-00'并且插入会产生错误,除非同时给出IGNORE。对于INSERT IGNOREUPDATE IGNORE,允许使用'0000-00-00'并且插入会产生警告。

因此,您应确保还启用了严格的SQL模式。但即便如此,作为a commenter has pointed out,这也不一定有效。并且MySQL也会忽略检查约束,因此也无法正常工作。如果你不想use a trigger,你就会陷入困境。

答案 1 :(得分:0)

正确的SQL答案是在列上添加check约束:

create table foo
(
  ...
  bar datetime not null check ( bar != '0000-00-00 00:00:00' ) ,
  ...
)

但是,mySql虽然非常乐意解析并且名义上“接受”check约束定义,但它会根据create table文档中的 sotto vocce 注释默默地忽略它们:

  

CHECK子句被解析但被所有存储引擎忽略。

为此,您可能希望添加before insert触发器来强制执行约束。您可能还应该强制执行日期实际上是一个有效日期,因为显然mySql甚至不会在datedatetime列中强制执行该最小约束:

  

MySQL允许您将某些不正确的日期值存储到DATEDATETIME   列(例如'2000-02-31'或'2000-02-00')。这个想法是,这不是工作   SQL服务器验证日期。如果MySQL可以存储日期值并检索   完全相同的值,MySQL将其存储为给定的。   如果日期完全错误(服务器存储它的能力之外),则特殊   “零”日期值'0000-00-00'存储在列中。

有关如何创建此类触发器的详细信息,请参阅此问题:Mysql CHECK Constraint

答案 2 :(得分:-1)

您的数据库不应负责验证脚本尝试插入的数据。

应检查给定数据是否与列的边界匹配(非空,类型和长度),但不关心实际的内容

如果将列设置为NOT NULL,MySQL仍会接受空字符串00000-00-00作为字符串/ int / date的“有效”值。

数据库应该存储数据 - 不验证它。如果要拒绝无效数据,这是您选择的编程语言应执行的任务。其他人(夸大其词)你可以将UI连接到数据库并省略任何“后端”逻辑。