Mysql中Identity的一个特性

假如表中包含一列为auto_increment,

如果是Myisam类型的引擎,那么在删除了最新一笔数据,无论是否重启Mysql,下一次插入之后仍然会使用上次删除的最大ID+1.

mysql> create table test_myisam (id int not null auto_increment primary key, name char(5)) engine=myisam;
Query OK, 0 rows affected (0.04 sec)

mysql> insert into test_myisam (name) select ‘a‘;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into test_myisam (name) select ‘b‘;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into test_myisam (name) select ‘c‘;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into test_myisam (name) select name from test_myisam;
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from test_myisam;
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  2 | b    |
|  3 | c    |
|  4 | a    |
|  5 | b    |
|  6 | c    |
+----+------+
6 rows in set (0.00 sec)

mysql> delete from test_myisam where id=6;
Query OK, 1 row affected (0.00 sec)
mysql> insert into test_myisam(name) select ‘d‘;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> select * from test_myisam;
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  2 | b    |
|  3 | c    |
|  4 | a    |
|  5 | b    |
|  7 | d    |
+----+------+
6 rows in set (0.00 sec)

下面是对Innodb表的测试。

mysql> create table test_innodb(id int not null auto_increment primary key, name char(5)) engine=innodb;
Query OK, 0 rows affected (0.26 sec)

mysql> insert into test_innodb (name)select ‘a‘;
Query OK, 1 row affected (0.06 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into test_innodb (name)select ‘b‘;
Query OK, 1 row affected (0.06 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into test_innodb (name)select ‘c‘;
Query OK, 1 row affected (0.07 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> select * from test_innodb;
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  2 | b    |
|  3 | c    |
+----+------+
3 rows in set (0.00 sec)

mysql> delete from test_innodb where id=3;
Query OK, 1 row affected (0.05 sec)

mysql> insert into test_innodb (name)select ‘d‘;
Query OK, 1 row affected (0.20 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> select * from test_innodb;
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  2 | b    |
|  4 | d    |
+----+------+
3 rows in set (0.00 sec)

mysql> exit
Bye
[[email protected] data]$ mysql -uroot -pwsdad
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.5.37-log Source distribution

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.

mysql> use wison
Database changed
mysql> delete from test_innodb where id=4;
Query OK, 1 row affected (0.07 sec)

mysql> exit
Bye
[[email protected] data]$ sudo service mysql restart
Shutting down MySQL... SUCCESS!
Starting MySQL.. SUCCESS!
[[email protected] data]$ mysql -uroot -pwison
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.37-log Source distribution

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.

mysql> use wison
Database changed
mysql> insert into test_innodb (name) select ‘z‘;
Query OK, 1 row affected (0.07 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> select * from test_innodb;
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  2 | b    |
|  3 | z    |
+----+------+
3 rows in set (0.00 sec)

可以看到在mysql数据库没有重启时,innodb的表新插入数据会是之前被删除的数据再加1.

但是当Mysql服务被重启后,再向InnodB的自增表表里插入数据,那么会使用当前Innodb表里的最大的自增列再加1.

原因:

Myisam类型存储引擎的表将最大的ID值是记录到数据文件中,不管是否重启最大的ID值都不会丢失。但是InnoDB表的最大的ID值是存在内存中的,若不重启Mysql服务,新加入数据会使用内存中最大的数据+1.但是重启之后,会使用当前表中最大的值再+1

 

时间: 2024-12-08 09:18:00

Mysql中Identity的一个特性的相关文章

MySQL中auto_increment的基本特性

创建数据表时,经常会出现auto_increment这个词,下面就来了解一下它吧. MySQL的中AUTO_INCREMENT类型的属性用于为一个表中记录自动生成ID功能,可在一定程度上代替Oracle,PostgreSQL等数据库中的sequence. 在数据库应用,我们经常要用到唯一编号,以标识记录.在MySQL中可通过数据列的AUTO_INCREMENT属性来自动生成. 可在建表时可用"AUTO_INCREMENT=n"选项来指定一个自增的初始值.可用alter table ta

Mysql中where条件一个单引号引发的性能损耗

日常写SQL中可能会有一些小细节忽略了导致整个sql的性能下降了好几倍甚至几十倍,几百倍.以下这个示例就是mysql语句中的一个单引号('')引发的性能耗损,我相信很多朋友都遇到过,甚至还在这样写. 先看下我的表结构: CREATE TABLE `d_sku` ( `id` varchar(36) NOT NULL, `commodity_id` varchar(36) DEFAULT NULL, `counts` int(11) DEFAULT NULL, `price` double(15,

mysql 中desc 作为一个表项导致的不能更新表项的问题

今天碰到一个mysql数据库更新问题,报错如下 于是我查看了下star_link_upgrade_history 没看出什么问题. 尝试了下更新别的项 更新cur_sw_ver项没有问题. 查看了下数据库项 desc与cur_sw_ver都是字符串类型.为啥一个有问题一个没有问题呢. 忽然想到desc是个关键字,是不是不能作为一个表项使用呢,尝试修改了这个项的名字,重建了这个表,再次操作更新没有问题了. 牢记不要把关键字作为表项!!! 原文地址:https://www.cnblogs.com/h

mysql中事务的四大特性

原子性(Atomicity) 事务就像“原子”一样,不可被分割,组成事务的DML操作语句要么全成功,要么全失败,不可能出现部分成功部分失败的情况. 一致性(Consistency) 一旦事务完成,不管是成功的,还是失败的,整个系统处于数据一致的状态. 隔离性(Isolation) 一个事务的执行不会被另一个事务所干扰.比如两个人同时从一个账户从取钱,通过事务的隔离性确保账户余额的正确性. 持久性(Durability) 也称为永久性,指事务一旦提交,对数据的改变就是永久的,不可以再被回滚. My

mysql中case的一个例子

最近遇到一个问题: year amount num 1991 1 1.1 1991 2 1.2 1991 3 1.3 1992 1 2.1 1992 2 2.2 1992 3 3.3 把上面表格的数据查询成: year m1 m2 m3 1991 1.1 1.2 1.3 1992 2.1 2.2 2.3 看到这样的需求,首先想到的是用case去统计以及 用group by来分组 第一版sql代码: SELECT `year`, (CASE WHEN amount = 1 THEN num END

在Mysql中如何显示所有用户?

在Mysql中如何显示所有用户? 这是一个mysql初学者经常问到的一个问题,今天我们就带大家看看是如何在Mysql中显示所有用户的.通常我们在mysql中使用SHOW DATABASES可以显示所有的数据库,SHOW TABLES将会显示所有的数据表,那么你是不是会猜测显示所有用户的命令是SHOW USERS呢?不不不,并不是的,现在让我们一起来看看如何显示所有用户吧. 在Mysql中显示所有用户 1.登录数据库 首先,你需要使用如下命令登录到数据库,注意,必须是root用户哦~ ## mys

mysql中key 、primary key 、unique key 与index区别

一.key与primary key区别 CREATE TABLE wh_logrecord ( logrecord_id int(11) NOT NULL auto_increment, user_name varchar(100) default NULL, operation_time datetime default NULL, logrecord_operation varchar(100) default NULL, PRIMARY KEY (logrecord_id), KEY wh

显示Mysql中的所有用户

在mysql中如何显示所有用户? 1.show databases显示所有数据库 2.show tables显示所有数据表 3.select current_user();显示当前用户 4.显示所有用户: 1.登录数据库 首先,你需要使用如下命令登录到数据库,注意,必须是root用户哦~ ## mysql -u root -p 2.查询用户表 在Mysql中其实有一个内置且名为mysql的数据库,这个数据库中存储的是Mysql的一些数据,比如用户.权限信息.存储过程等,所以呢,我们可以通过如下简

在 mysql 中利用 Duplicate key, 一句话实现存在的更新不存在插入功能

mysql 中可以用一个sql命令实现在插入时,如果发现唯一索引重复的记录则自动改为更新语句, 语句如下: INSERT INTO radcheck (username,attribute,op,VALUE) VALUES ('tyson','Cleartext-Password',':=','123') on duplicate key update value='123'; 注意,radcheck 表中 username 和 attribute 列是个组合的唯一索引. alter table