我在OS X 10.9.1上使用MySQL 5.5.37。我有一个类型为NOT NULL
的{{1}}列。在不使用触发器的情况下,如何阻止00:00:00&00; 00进入我的专栏?我接受CURRENT_TIMESTAMP的值代替所有的零。
我试过了:
DATETIME
运行上面的内容后,我仍然可以在表格中插入零日期。
答案 0 :(得分:5)
不使用触发器(您声明的条件),您不能。但是,根据the MySQL documentation,
NO_ZERO_DATE
模式会影响服务器是否允许'0000-00-00'作为有效日期。 其效果还取决于是否启用了严格SQL
模式。
如果此模式未启用,则允许使用'0000-00-00'并且插入不会产生警告。
如果此模式 启用,则允许使用'0000-00-00'并且插入会产生警告。
如果启用此模式和严格模式,则不允许使用'0000-00-00'并且插入会产生错误,除非同时给出IGNORE
。对于INSERT IGNORE
和UPDATE 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甚至不会在date
和datetime
列中强制执行该最小约束:
MySQL允许您将某些不正确的日期值存储到
DATE
和DATETIME
列(例如'2000-02-31'或'2000-02-00')。这个想法是,这不是工作 SQL服务器验证日期。如果MySQL可以存储日期值并检索 完全相同的值,MySQL将其存储为给定的。 如果日期完全错误(服务器存储它的能力之外),则特殊 “零”日期值'0000-00-00'存储在列中。
有关如何创建此类触发器的详细信息,请参阅此问题:Mysql CHECK Constraint
答案 2 :(得分:-1)
您的数据库不应负责验证脚本尝试插入的数据。
应检查给定数据是否与列的边界匹配(非空,类型和长度),但不关心实际的内容。
如果将列设置为NOT NULL
,MySQL仍会接受空字符串0
或0000-00-00
作为字符串/ int / date的“有效”值。
数据库应该存储数据 - 不验证它。如果要拒绝无效数据,这是您选择的编程语言应执行的任务。其他人(夸大其词)你可以将UI连接到数据库并省略任何“后端”逻辑。