北京网站建,wordpress后台界面模板,广州建网站多少钱,dedecms网站搬家我们知道MySQL表可以定义一个自增长的id#xff0c;如果我们的表没有指定主键字段#xff0c;那MySQL会给我们的表创建一个不可见的#xff0c;长度为6个自己的row_id#xff0c;然后不停地往上加步长#xff0c;虽然生活中自然数是没有上限的#xff0c;但是在计算机里如果我们的表没有指定主键字段那MySQL会给我们的表创建一个不可见的长度为6个自己的row_id然后不停地往上加步长虽然生活中自然数是没有上限的但是在计算机里我们只要定义了表示这个数的字节长度那么它就有上限比如在Java中int类型的上限值为2^31-1即2147483647。MySQL无符号整数上限为2^32 -1即4294967295表的自增id用完了怎么办表定义的自增id达到了上线后再申请下一个id时得到的值保持不变。验证一下CREATE TABLE user (id int(20) unsigned NOT NULL AUTO_INCREMENT,name varchar(10) DEFAULT NULL,PRIMARY KEY (id)) ENGINEInnoDB AUTO_INCREMENT4294967295 DEFAULT CHARSETutf8;上面创建了一张user表id为自增主键并且我们把AUTO_INCREMENT设置成了4294967295也就是说下次执行insert语句的时候id为并且我们把AUTO_INCREMENT设置成了4294967295INSERT INTO test.user (name) VALUES (张三);结果如图同样我们在执行一次insert语句就会报主键冲突异常MySQL InnoDB系统自增row_id用完了怎么办如果我们创建的表没有指定主键那MySQL会给我们指定一个row_id作为主键。InnoDB维护了一个全局的dict_sys.row_id值所有没有主键的InnoDB表再每次插入一行数据时都会将当前的dict_sys.row_id值作为要插入数据的row_id然后dict_sys.row_id的值加1。row_id占用6个字节长度所以row_id也是有范围的即row_id值的范围是从0到2^48(无符号)。和MySQL自增id不同的是如果row_id达到了上限下一次取值就从0开始然后继续循环。如果插入一条数据时申请到的row_id比如是0如果表中没有row_id为0的数据则直接将数据插入到表中但如果表中已经有row_id为0的数据再插入时就会覆盖掉原来的数据。验证一下创建一张没有主键的表CREATE TABLE use_row_id (name varchar(10) DEFAULT NULL) ENGINEInnoDB DEFAULT CHARSETutf8;然后依次执行以下语句gdb -p 5132 -ex p dict_sys.row_id1 --batchINSERT INTO test.use_row_id (name) VALUES (张三);gdb -p 5132 -ex p dict_sys.row_id281474976710656 --batchINSERT INTO test.use_row_id (name) VALUES (李四);INSERT INTO test.use_row_id (name) VALUES (王五);结果如图从图中可以看到原来的张三那条数据已经被覆盖了。总结MySQL自增id用完后再次申请id得到的值保持不变。插入数据会报主键冲突异常。MySQL InnoDB表未指定主键时MySQL会指定一个row_id如果row_id用完了则会从头开始循环。从这点来说还是建议我们创建表的时候指定主键的毕竟使用row_id会发生覆盖数据导致原来的数据丢失影响数据的可靠性。