51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 762|回复: 0
打印 上一主题 下一主题

MySQL自增ID,居然大部分人都搞错了

[复制链接]
  • TA的每日心情
    无聊
    3 天前
  • 签到天数: 1050 天

    连续签到: 1 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2022-5-20 10:55:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    MySQL删除数据的三种方式》中的作业题,99%的人答错,有点出乎意料。画外音:评论中不乏嘲笑知识点简单的小伙伴。
      今天简单说下作业题中的答案,以及知识点。
      作业题是这样的:

     实验步骤如上图:
      第一步:建表,设定自增列;
      第二步:指定id=1插入,锚定第一行是id是1;
      第三步:不指定id,依赖自增机制,插入3行;画外音:此时id应该变为2,3,4了?
      第四步:delete删除所有记录;画外音:坑就容易出在这里。
      第五步:指定id=0插入;
      第六步:指定id=1插入;
      第七步:不指定id,依赖自增机制,插入1行;
      请问,此时表中的三行记录,id分别是多少?
      知识点一:delete数据后,自增列计数不会从头开始。
      画外音:truncate数据后,自增列计数会从头开始。

    因此,在第四步delete删除所有4条记录后,自增列计数,并不会重新归0,也就是说,下一条insert的记录,自增列的值会是5。
      知识点二:含自增列的表,插入时可以手动指定自增列的值,但不能与已有值冲突,也可以使用系统默认自增列的值。
      因此,第五、六、七步都是允许的:
    1. insert (0, '000')
    2.   insert (1, '111')
    3.   insert ('222')
    复制代码
     知识点三:如果手动指定自增列的值是0或者NULL,MySQL会视为无效,并使用系统默认自增列的值。
      也就是说,第五步insert (0, '000') 又或者 insert (NULL, '000')都会被MySQL视为:
    1.   insert ('000')
    复制代码

     即,实际插入到表中的记录是
    1.  (5, '000')
    复制代码

    第六步insert (1, '111')没有问题
      实际插入的也是
    1. (1, '111')
    复制代码
     知识点四:如果使用系统默认自增列的值,会从当前最大值开始往后增加。
      也就是说,第七步insert ('222'),会使用默认值6,而不是2。

    实际插入的是
    1.  (6, '222')
    复制代码
    故,实验结果,最终的三行记录是:
    1.  5,000
    2.   1,111
    3.   6,222
    复制代码
    你答对了吗?
      为了巩固下上面的知识点,咱们一起来复习一下:
    1.  drop table t1;
    2.   create table t1(
    3.       id int not null auto_increment,
    4.       name varchar(10) unique,
    5.       count int default 0,
    6.       primary key(id),
    7.       index(name)
    8.   )engine=innodb;
    9.   insert into t1(id, name) values(1, "shenjian");
    10.   insert into t1(id, name) values
    11.   (111, "111"),(NULL, "abc"),(222, "222"),(NULL,"xyz");
    复制代码
    请问,执行结束后id分别是多少呢?
      答案:
    1.  (1, 'shenjian')
    2.   (111, '111')    // 允许指定值
    3.   (112, 'abc')    // 忽略NULL,从最大值开始增
    4.   (222, '222')    // 允许指定值
    5.   (223, 'xyz')    // 忽略NULL,从最大值开始增
    复制代码
    上题如果继续执行以下语句:
    1. insert into t1(name)values("shenjian"),("aaa"),("bbb")
    2.   on duplicate key update count=100;
    复制代码
    请问:
      ·会不会执行报错?
      · 如果报错,为什么呢?
      · 如果不报错,得到的数据是什么呢?
      知其然,更知其底层所以然。









    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-24 19:11 , Processed in 0.063181 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表