社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

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

架构师之路 • 2 年前 • 325 次点击  
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

知识点二:含自增列的表,插入时可以手动指定自增列的值,但不能与已有值冲突,也可以使用系统默认自增列的值。
因此,第五、六、七步都是允许的:
insert (0, '000')
insert (1, '111')
insert ('222')

知识点三:如果手动指定自增列的值是0或者NULL,MySQL会视为无效,并使用系统默认自增列的值。
也就是说,第五步
insert (0, '000') 又或者 insert (NULL, '000')
都会被MySQL视为:
insert ('000')
即,实际插入到表中的记录是
(5, '000')

第六步
insert (1, '111')没有问题
实际插入的也是
(1, '111')

知识点四:如果使用系统默认自增列的值,会从当前最大值开始往后增加。

也就是说,第七步

insert ('222'),会使用默认值6,而不是2。
实际插入的是
(6, '222')

故,实验结果,最终的三行记录是:
5,000
1,111
6,222
你答对了吗?

为了巩固下上面的知识点,咱们一起来复习一下:
drop table t1;
create table t1(
    id int not null 
auto_increment,
    name varchar(10) 
unique,
    count int default 0,
    primary key(id),
    index(name)
)engine=innodb;

insert into t1(id, name) values(
1, "shenjian");

insert into t1(id, name) values 
(111, "111"),(NULL, "abc"),(222, "222"),(NULL,"xyz");
 
请问,执行结束后id分别是多少呢?
答案:

(1, 'shenjian')

(111, '111')    // 允许指定值

(112, 'abc')    // 忽略NULL,从最大值开始增

(222, '222')    // 允许指定值

(223, 'xyz')    // 忽略NULL,从最大值开始增


上题如果继续执行以下语句:

insert into t1(name)values("shenjian"),("aaa"),("bbb")

on duplicate key update count=100;

 
请问:
(1)会不会执行报错?
(2)如果报错,为什么呢?
(3)如果不报错,得到的数据是什么呢?
回答正确,并解释清楚原因,可以送书哟。

知其然,更知其底层所以然。
关注“架构师之路”,下期揭晓答案。
架构师之路-分享技术思路

相关文章

架构师之路,21年干货精选

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/134535
 
325 次点击