Mysql の ID の詳細な紹介

黄舟
黄舟オリジナル
2016-12-15 16:32:232585ブラウズ

テーブルに 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
[2@a 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
[2@a data]$ sudo service mysql restart
Shutting down MySQL... SUCCESS!
Starting MySQL.. SUCCESS!
[2@a 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 を使用します。ただし、再起動後は、現在のテーブルの最大値が使用されます。この記事を読んでいただきありがとうございます。上記は Mysql の ID について詳しく説明したものです。その他の関連記事については、PHP 中国語 Web サイト (www.php) を参照してください。 .cn)!

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。