我正在学习SQL,并使用Mysql来处理查询。关于主键的主题,我读到了
无论哪个列声明为主键,它都不能为空。
因此,我制作了一个简单的employee表,其中字段为id,name使用PRIMARY KEY作为id;
然后输入以下查询,
INSERT INTO employee (id, name) VALUES (1, 'John');
INSERT INTO employee (id, name) VALUES (2, 'Frank');现在,为了测试主键列而不是Null属性,我输入了以下查询。
INSERT INTO employee(name) VALUES('Joe');结果没有显示错误,查询成功运行。
在从整个表中选择记录时,我看到
id |name
0 | Joe
1 | John
2 | Frank我还以为会看到错误呢
列'id‘不能为空
但是如您所见,Joe的主键被自动设置为0。我试着再插一次,不给身份证。
现在我收到消息了,
关键字“主”的“0”重复条目
这里发生了什么?主键不是从1开始的
发布于 2017-08-28 23:02:53
MySQL (5.7之前)对主键使用隐式默认值0,请参见文档
如果该列不能接受NULL作为值,则MySQL将定义该列并没有显式的默认子句。异常:如果列被定义为主键的一部分,但没有显式地定义为NULL,则MySQL将其创建为NULL列(因为主键列必须为NULL)。在MySQL 5.7.3之前,还使用隐式默认值为该列分配了一个DEFAULT子句。为了防止这种情况,在任何主键列的定义中包含一个显式NULL。
如果将null插入到这样的列中,则采用隐式值,除非设置严格模式:
对于没有显式默认子句的NULL列的数据输入.
数值类型的隐式默认值为0。因此,每次使用null (或者根本不使用列)时,MySQL都使用0。这是第一次工作,但不是第二次。
发布于 2017-08-28 22:52:56
您已经在AUTO_INCREMENT字段上设置了id属性。这是一个很好的小特性,可以确保值始终是唯一的,这样您就不必担心它是null,而不必担心那些重要的东西。但如果你试着这样做,错误肯定会抛在你身上;
INSERT INTO `employee` (`id`, `name`) VALUES (null, `Joe`);编辑啊,我没看到你发布的错误。这里发生了什么;您实际上没有设置AUTO_INCREMENT属性(尽管您应该设置;)。现在,id字段是一个整数字段。如果您没有给出任何值,mysql试图通过给出最可能的值,或者最接近于没有值的值(即0 )来节省您的精力。第一次一切顺利,第二次看到价值已经存在,但失败了。
https://stackoverflow.com/questions/45928352
复制相似问题