当故意在主键AUTO_INCREMENT列中插入“NULL”时,MySQL没有失败

时间:2015-01-09 05:17:22

标签: mysql sql

我创建了一个表empInfo,如下所示

CREATE TABLE empInfo (
  empid INT(11) PRIMARY KEY AUTO_INCREMENT  ,
  firstname VARCHAR(255) DEFAULT NULL,
  lastname VARCHAR(255) DEFAULT NULL
 )

然后我在Insert语句下面运行: -

INSERT INTO empInfo VALUES(NULL , 'SHREE','PATIL');
INSERT INTO empInfo(firstname,lastname) VALUES( 'VIKAS','PATIL');
INSERT INTO empInfo VALUES(NULL , 'SHREEKANT','JOHN');

我认为第一个或第三个SQL将失败,因为empid是PRIMARY KEY,我们正在尝试为empid插入NULL。

但是MYSQL证明我错了,所有3个查询都成功运行。

我想知道为什么尝试在NULL列中插入empid时没有失败?

表中提供的最终数据如下

empid   firstname   lastname
1       SHREE       PATIL
2       VIKAS       PATIL
3       SHREEKANT   JOHN

我可以发现它有一些与AUTO_INCREMENT相关的东西但是我无法弄清楚它的原因。关于此的任何指示。

4 个答案:

答案 0 :(得分:2)

正是因为自动增量。如您所见,db中没有empid值为null。这是自动增量的目的。通常,您不会在插入中包含该列,这与分配null

相同

答案 1 :(得分:2)

根据documentation page

  

没有为AUTO_INCREMENT列指定值,因此MySQL会自动分配序列号。您还可以向列显式指定0以生成序列号。 如果列声明为NOT NULL,则还可以为列分配NULL以生成序列号。

所以,因为你有一个自动增量空允许字段,它忽略你正在尝试在那里放置一个NULL的事实,而是给你一个有序的数字。< / p>

你可以保持原样,因为即使没有 not null约束,你也不能在那里得到一个NULL,因为它会自动将它转换为一个有序的数字。

或者,如果您愿意,您可以列更改为<{1}},但我仍然认为empid INT(11) PRIMARY KEY AUTO_INCREMENT NOT NULL将允许您指定NULL,将它们转换为已排序的数字尽管文档说明了这些内容(在MySQL insert5.6.6 m9 sqlfiddle上进行了测试)。

两个情况下,您仍然可以强制列为特定(非零)数字,当然还有约束条件。

答案 2 :(得分:1)

behaviour is by design,即将0, NULL, or DEFAULT插入AUTO_INCREMENT列,都会触发AUTO_INCREMENT行为。

INSERT INTO empInfo VALUES(DEFAULT, 'SHREEKANT','JOHN');
INSERT INTO empInfo VALUES(NULL, 'SHREEKANT','JOHN');
INSERT INTO empInfo VALUES(0, 'SHREEKANT','JOHN');

并且是commonplace practice

但请注意,4.1.6

之前的版本并非如此

修改

  

这是否意味着AUTO_INCREMENT正在超越PRIMARY KEY?

是的,因为主键取决于AUTO_INCREMENT在约束检查和记录插入之前传递新序列,AUTO_INCREMENT进程(包括NULL / 0 / DEFAULT的上述重新定位)在任何情况下都需要在检查PRIMARY KEY约束之前解决。

如果删除AUTO_INCREMENT并将emp_id PK定义为INT(11) NULL(这是无意义的,但MySql将以这种方式创建列),只要您将NULL插入PK你会得到熟悉的

  

错误代码:1048。列'emp_id'不能为空

很明显,AUTO_INCREMENT分辨率先于主键约束检查。

答案 3 :(得分:0)

CREATE TABLE empInfo (
  empid INT(11) PRIMARY KEY AUTO_INCREMENT NOT NULL,
  firstname VARCHAR(255) DEFAULT NULL,
  lastname VARCHAR(255) DEFAULT NULL
 )

不确定,但我认为它会起作用:)