2015-03-02 121 views
4

在mysql数据插入时,遇到了以下问题。这里的电子邮件字段不能为空。在执行以下查询时(查询1 & 2),我们期待错误。但查询1给出错误,查询2给出成功。Mysql多重插入查询

表结构法

CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`name` varchar(100) NOT NULL, 
`email` varchar(100) NOT NULL, 
PRIMARY KEY (`id`), 
KEY `id` (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1 

查询1:

INSERT INTO `users` (`id`, `name`, `email`) VALUES (NULL, 'manu', NULL); 

结果: - #1048 - 柱 '电子邮件' 不能为空

问题2:

INSERT INTO `users` (`id`, `name`, `email`) 
VALUES (NULL, 'manu', NULL),(NULL, 'Jose', NULL); 

结果:插入-2行。

Both query returns success.

有没有在查询中的任何错误?任何想法将不胜感激。

+0

此行为是不是在SQL提琴重复性。第二个查询生成与第一个相同的错误。 – 2015-03-02 13:20:27

+0

如果使用完全相同的结构创建一个名为“users2”的新表并尝试再次运行查询,会发生什么情况?在运行每个查询之后,查看表中有哪些数据结束会很有趣。我看不出为什么两个查询都不会失败。 – thirtyish 2015-03-02 13:23:04

+0

@GordonLinoff,我们在服务器版本中得到了这个:5.5.37-0ubuntu0.12.04.1-log(Ubuntu) – 2015-03-02 13:28:52

回答

4

documentation

无效插入到已声明NOT NULL列。对于 多行INSERT语句或INSERT INTO ... SELECT语句, 该列设置为列数据的隐式默认值 类型。数字类型为0,字符串为 类型的空字符串(''),以及日期和时间类型的“零”值。 INSERT INTO ... SELECT语句的处理方式与多行插入相同 ,因为服务器不检查从SELECT到 的结果集是否返回单行。 (对于单一行INSERT,当NULL被插入一个NOT NULL列没有发生 警告,而是 语句失败与错误。)

+0

在这种情况下,'varchar'字段的默认值是什么? – 2015-03-02 13:37:59

+1

对于ENUM以外的字符串类型,默认值为空字符串。对于ENUM,默认值是第一个枚举值。 - http://dev.mysql.com/doc/refman/5.0/en/data-type-defaults.html – Foreever 2015-03-02 16:00:28