首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql中的主键混淆了吗?

问Mysql中的主键混淆了吗?
EN

Stack Overflow用户
提问于 2017-08-28 22:47:21
回答 2查看 335关注 0票数 1

我正在学习SQL,并使用Mysql来处理查询。关于主键的主题,我读到了

无论哪个列声明为主键,它都不能为空。

因此,我制作了一个简单的employee表,其中字段为id,name使用PRIMARY KEY作为id;

然后输入以下查询,

代码语言:javascript
复制
INSERT INTO employee (id, name) VALUES (1, 'John');
INSERT INTO employee (id, name) VALUES (2, 'Frank');

现在,为了测试主键列而不是Null属性,我输入了以下查询。

代码语言:javascript
复制
INSERT INTO employee(name) VALUES('Joe');

结果没有显示错误,查询成功运行。

在从整个表中选择记录时,我看到

代码语言:javascript
复制
id |name
0  | Joe
1  | John
2  | Frank

我还以为会看到错误呢

列'id‘不能为空

但是如您所见,Joe的主键被自动设置为0。我试着再插一次,不给身份证。

现在我收到消息了,

关键字“主”的“0”重复条目

这里发生了什么?主键不是从1开始的

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-28 23:02:53

MySQL (5.7之前)对主键使用隐式默认值0,请参见文档

如果该列不能接受NULL作为值,则MySQL将定义该列并没有显式的默认子句。异常:如果列被定义为主键的一部分,但没有显式地定义为NULL,则MySQL将其创建为NULL列(因为主键列必须为NULL)。在MySQL 5.7.3之前,还使用隐式默认值为该列分配了一个DEFAULT子句。为了防止这种情况,在任何主键列的定义中包含一个显式NULL。

如果将null插入到这样的列中,则采用隐式值,除非设置严格模式:

对于没有显式默认子句的NULL列的数据输入.

  • 如果启用了严格的SQL模式,则事务性表将发生错误并回滚该语句。对于非事务性表,会发生错误,但如果这发生在多行语句的第二行或后续行,则前面的行将被插入。
  • 如果不启用严格模式,则MySQL将列设置为列数据类型的隐式默认值.。

数值类型的隐式默认值为0。因此,每次使用null (或者根本不使用列)时,MySQL都使用0。这是第一次工作,但不是第二次。

票数 2
EN

Stack Overflow用户

发布于 2017-08-28 22:52:56

您已经在AUTO_INCREMENT字段上设置了id属性。这是一个很好的小特性,可以确保值始终是唯一的,这样您就不必担心它是null,而不必担心那些重要的东西。但如果你试着这样做,错误肯定会抛在你身上;

代码语言:javascript
复制
INSERT INTO `employee` (`id`, `name`) VALUES (null, `Joe`);

编辑啊,我没看到你发布的错误。这里发生了什么;您实际上没有设置AUTO_INCREMENT属性(尽管您应该设置;)。现在,id字段是一个整数字段。如果您没有给出任何值,mysql试图通过给出最可能的值,或者最接近于没有值的值(即0 )来节省您的精力。第一次一切顺利,第二次看到价值已经存在,但失败了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45928352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档