我只是想知道是否有人可以解释这一点。
我只是测试我的代码,并没有检查空输入字段(我知道我必须,但只是测试)..在我的数据库表中,所有字段都是非NULL,我期待一个例外,因为我没有插入任何东西..但事实证明MySQL插入所有空白值,同样,从MySQL工作台也是同样的事情..
有没有办法防止这种情况发生? (从MySQL的角度来看)
答案 0 :(得分:2)
这种行为虽然不典型,却很好documented:
将NULL插入已声明为NOT NULL的列中。对于 多行
INSERT
语句或INSERT INTO ... SELECT
语句, 该列设置为列数据的隐式默认值 类型。数字类型为0,字符串为空字符串('') 类型,以及日期和时间类型的“零”值。INSERT INTO ... SELECT
语句的处理方式与多行插入的处理方式相同 因为服务器不会检查SELECT中的结果集 看它是否返回一行。 (对于单行INSERT
,没有 将NULL插入NOT NULL列时发生警告。代替, 该陈述失败并出现错误。)
因此,如果您想获得错误,请使用VALUES()
一行。或者,定义执行检查的触发器。
为什么MySQL以这种方式工作?我不知道,要区别于其他数据库并阻止ANSI兼容性?更严重的是,我认为这是一个效率问题,并且与MySQL没有实现check
约束的事实有关。 NOT NULL
声明只是检查约束的一个示例,并且不支持这些声明。