2016-01-13 229 views
1

我已经得到了用户的数据库表具有类似于这样的设置:MySQL允许插入即使必填字段不存在

+---------------------+--------------+------+-----+------------+----------------+ 
| Field    | Type   | Null | Key | Default | Extra   | 
+---------------------+--------------+------+-----+------------+----------------+ 
| id_user    | int(5)  | NO | PRI | NULL  | auto_increment | 
| login    | varchar(50) | NO |  |   |    | 
| password   | varchar(50) | NO |  |   |    | 
| address    | varchar(255) | NO |  | NULL  |    | 
+---------------------+--------------+------+-----+------------+----------------+ 

由于地址字段设置为不为null,则默认为null,这应该有效地使地址字段是必需的,对吗?

但是,当我执行查询,如下所示:

INSERT INTO mydatabase.users 
SET 
    mydatabase.users.login='test_username', 
    mydatabase.users.password='test_password' 

它成功地为用户节省了不抱怨的地址字段,它被设置为一个空的空间。

可能是什么造成的?我期望在这种情况下出现错误。我用MySQL 5.5和5.6试了一下。

回答

3

Strict SQL mode未在配置文件中启用,因此MySQL的过数据插入放宽某些控件:

严格模式控制的MySQL如何在数据变化语句,例如插入或更新处理无效或缺失值。由于多种原因,值可能无效。例如,它可能具有该列的错误数据类型,或者它可能超出范围。当要插入的新行不包含非NULL列的值时,缺少其定义中没有显式DEFAULT子句的值。 (对于NULL列,如果值缺失,则插入NULL。)严格模式也影响DDL语句,例如CREATE TABLE。

+0

每天学习新东西,谢谢!我将它添加到我的my.ini文件中:'sql-mode =“STRICT_TRANS_TABLES”'现在它的工作方式如何。 – Chris