我创建了一个表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
相关的东西但是我无法弄清楚它的原因。关于此的任何指示。
答案 0 :(得分:2)
正是因为自动增量。如您所见,db中没有empid值为null。这是自动增量的目的。通常,您不会在插入中包含该列,这与分配null
相同答案 1 :(得分:2)
没有为AUTO_INCREMENT列指定值,因此MySQL会自动分配序列号。您还可以向列显式指定0以生成序列号。 如果列声明为NOT NULL,则还可以为列分配NULL以生成序列号。
所以,因为你有一个自动增量空允许字段,它忽略你正在尝试在那里放置一个NULL的事实,而是给你一个有序的数字。< / p>
你可以保持原样,因为即使没有 not null
约束,你也不能在那里得到一个NULL,因为它会自动将它转换为一个有序的数字。
或者,如果您愿意,您可以将列更改为<{1}},但我仍然认为empid INT(11) PRIMARY KEY AUTO_INCREMENT NOT NULL
将允许您指定NULL,将它们转换为已排序的数字尽管文档说明了这些内容(在MySQL insert
和5.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');
但请注意,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
)
不确定,但我认为它会起作用:)