Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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
如何阻止“0000-00-00:00:00”日期值进入MySQL表?_Mysql_Sql_Date_Datetime - Fatal编程技术网

如何阻止“0000-00-00:00:00”日期值进入MySQL表?

如何阻止“0000-00-00:00:00”日期值进入MySQL表?,mysql,sql,date,datetime,Mysql,Sql,Date,Datetime,我正在OSX10.9.1上使用MySQL 5.5.37。我有一个DATETIME类型的非空列。如果不使用触发器,如何阻止“0000-00-00:00:00”的值进入我的列?我将接受一个CURRENT_TIMESTAMP值来代替所有的零 我试过: SET sql_mode = 'NO_ZERO_DATE'; 在运行上述操作后,我仍然能够在表中插入零日期。如果不使用触发器,则无法执行所述条件。但据报道, NO_ZERO_DATE模式会影响服务器是否允许“0000-00-00”作为有效日期。它的效果

我正在OSX10.9.1上使用MySQL 5.5.37。我有一个DATETIME类型的非空列。如果不使用触发器,如何阻止“0000-00-00:00:00”的值进入我的列?我将接受一个CURRENT_TIMESTAMP值来代替所有的零

我试过:

SET sql_mode = 'NO_ZERO_DATE';

在运行上述操作后,我仍然能够在表中插入零日期。

如果不使用触发器,则无法执行所述条件。但据报道,

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

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

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

如果启用此模式和严格模式,则不允许使用“0000-00-00”,并且插入会产生错误,除非同时给出了忽略。对于插入忽略和更新忽略,允许使用“0000-00-00”,并且插入会产生警告


因此,您应该确保也启用了严格的SQL模式。但即便如此,这也不一定有效。MySQL也会忽略检查约束,所以这也不起作用。如果你不想,你就被卡住了。

如果不使用所述条件,你就不能。但据报道,

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

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

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

如果启用此模式和严格模式,则不允许使用“0000-00-00”,并且插入会产生错误,除非同时给出了忽略。对于插入忽略和更新忽略,允许使用“0000-00-00”,并且插入会产生警告


因此,您应该确保也启用了严格的SQL模式。但即便如此,这也不一定有效。MySQL也会忽略检查约束,所以这也不起作用。如果您不想这样做,您将陷入困境。

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

它应该检查给定的数据是否与列的边界匹配,不为null、类型和长度,但实际上并不关心实际内容

如果将列设置为NOTNULL,MySQL仍将接受空字符串0或0000-00-00作为string/int/date的有效值


数据库应该存储数据,而不是验证数据。如果要拒绝无效数据,这是您选择的编程语言应该执行的任务。否则,您可能会将UI与数据库连接起来,并忽略任何后端逻辑。

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

它应该检查给定的数据是否与列的边界匹配,不为null、类型和长度,但实际上并不关心实际内容

如果将列设置为NOTNULL,MySQL仍将接受空字符串0或0000-00-00作为string/int/date的有效值


数据库应该存储数据,而不是验证数据。如果要拒绝无效数据,这是您选择的编程语言应该执行的任务。否则,您可以将UI与数据库连接起来,并省略任何后端逻辑。

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

create table foo
(
  ...
  bar datetime not null check ( bar != '0000-00-00 00:00:00' ) ,
  ...
)
然而,mySql虽然非常乐意解析并名义上“接受”检查约束定义,但根据create table文档中的sotto vocce注释,它会默默地忽略它们:

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

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

MySQL允许您将某些不正确的日期值存储到date和DATETIME中 列,如“2000-02-31”或“2000-02-00”。想法是,这不是工作 用于验证日期的SQL server的。如果MySQL可以存储日期值并检索 完全相同的值,MySQL按照给定的方式存储它。 如果日期完全错误,超出了服务器的存储能力,则 “零”日期值“0000-00-00”存储在列中


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

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

create table foo
(
  ...
  bar datetime not null check ( bar != '0000-00-00 00:00:00' ) ,
  ...
)
然而,mySql虽然非常乐意解析并名义上“接受”检查约束定义,但根据create table文档中的sotto vocce注释,它会默默地忽略它们:

CHECK子句已解析,但被所有 存储引擎

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

MySQL允许您将某些不正确的日期值存储到date和DATETIME中 列,如“2000-02-31”或“2000-02-00”。想法是,这不是工作 用于验证日期的SQL server的。如果MySQL可以存储日期值并检索 完全相同的值,MySQL按照给定的方式存储它。 如果日期完全错误,超出了服务器的存储能力,则 “零”日期值“0000-00-00”存储在列中



有关如何创建这样一个触发器的详细信息,请参见此问题:

hWhow about via constraint,la-@Coffee。MySQL实际上并没有执行检查约束。如何通过约束,一个la-@Coffee。MySQL实际上并不执行检查约束。这只是解释了为什么无零日期不起作用。它没有回答该做什么的问题。您将答案编辑为“关于严格SQL模式”的部分加粗,但您引用的文本显示,即使在严格模式下,错误仍可能成为一个警告,导致插入假日期。我认为这是显而易见的,我将OP需要做的事情加粗,并在最后添加了一句话,再次说明。显示它实际上并没有阻止插入“0000-00-00”。@hvd有趣的是,如果OP坚持使用DATETIME而不是TIMESTAMP,并且不使用触发器,则不确定是否有任何帮助。是的,我认为触发器是可靠阻止它的唯一方法。这只解释了为什么无零日期不起作用。它没有回答该做什么的问题。您将答案编辑为“关于严格SQL模式”的部分加粗,但您引用的文本显示,即使在严格模式下,错误仍可能成为一个警告,导致插入假日期。我认为这是显而易见的,我将OP需要做的事情加粗,并在最后添加了一句话,再次说明。显示它实际上并没有阻止插入“0000-00-00”。@hvd有趣的是,如果OP坚持使用DATETIME而不是TIMESTAMP,并且不使用触发器,则不确定是否有任何帮助。是的,“我认为你是对的,触发器是可靠地阻止它的唯一方法。”戈登林诺夫甚至可以随意否决投票——为什么数据库要接管逻辑决策?如果有人因为圣诞节而不允许XXXX-12-24的日期怎么办?数据库是否应该为此提供一个选项。我在一年多前就停止了向下投票,但这确实让我失去了信心。数据库实际上比应用程序更适合验证数据。然而,这与被问的问题无关。@GordonLinoff好吧,我不同意这个观点。如果数据与列的边界匹配,则数据库应存储该数据。关于实际内容的决定应该由使用数据库的代码来决定——比如不允许日期在过去,不允许生日的人年龄超过150岁等等。但也许你有一个例子,在这个例子中,数据库可能是验证数据的更好的地方。我做过的每一个合理的应用程序。数据库是数据存储。这就是为什么数据库支持检查约束和其他验证数据的方法。数据库应仅存储满足应用程序要求的数据。检查越接近数据,它们实际执行的一致性就越高。@GordonLinoff我完全同意,数据库应该只包含有效数据。但在格式和类型方面有效——而不是在内容方面。如果要在布尔列中存储false,那么应该可以!不应该有任何限制,只允许真实。。。好吧,不同的意见。我会记住你的方法,也许会为它找到一个有用的案例——即使现在很难想象。@GordonLinoff甚至可以随意否决——为什么数据库要接管逻辑决策?如果有人因为圣诞节而不允许XXXX-12-24的日期怎么办?数据库是否应该为此提供一个选项。我在一年多前就停止了向下投票,但这确实让我失去了信心。数据库实际上比应用程序更适合验证数据。然而,这与被问的问题无关。@GordonLinoff好吧,我不同意这个观点。如果数据与列的边界匹配,则数据库应存储该数据。关于实际内容的决定应该由使用数据库的代码来决定——比如不允许日期在过去,不允许生日的人年龄超过150岁等等。但也许你有一个例子,在这个例子中,数据库可能是验证数据的更好的地方。我做过的每一个合理的应用程序。数据库是数据存储。这就是为什么数据库支持检查约束和其他验证数据的方法
. 数据库应仅存储满足应用程序要求的数据。检查越接近数据,它们实际执行的一致性就越高。@GordonLinoff我完全同意,数据库应该只包含有效数据。但在格式和类型方面有效——而不是在内容方面。如果要在布尔列中存储false,那么应该可以!不应该有任何限制,只允许真实。。。好吧,不同的意见。我会记住你的方法,也许会找到一个有用的例子——即使现在很难想象。