MySQLの自己増IDに関するいくつかの小さな問題をまとめました。


これらの小さな問題はInnoDB記憶エンジンに基づいています。
1.IDの最大の記録を削除した後、新たに挿入された記録IDは何ですか?
例えば、現在の表にはIDが1,2,3本の記録があります。3を削除して、新しく記録に挿入されたIDはどこから始まりますか?
4から始まります。
実験
テーブルtb 0を作成し、IDは自己増加します。

create table tb0(id int unsigned auto_increment primary key);
3つのレコードを挿入:

insert into tb0 values(null);
IDが3のレコードを削除:

delete from tb0 where id=3
現在の自己増値を表示します。

show create table tb0;

#   
CREATE TABLE `tb0` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
自己増加IDは4であり、削除IDの最大の記録は自己増加IDの値に影響しない。
2.MySQLを再起動したら増IDはどこから始まりますか?
例えば、現在の表にはIDが1,2,3本の記録があります。3を削除し、MySQLを再開します。新たに記録したIDはどこから始まりますか?
4から始まると思っている人が多いですが、実は3からです。
InnoDBの自己増値はメモリに記録されているので、データファイルに記録されていません。
再起動後、現在の最大ID+1を開始値とします。
実験
表tb 1を作成し、IDは自己増加します。

create table tb1(id int unsigned auto_increment primary key);
3つのデータレコードを追加します。

insert into tb1 values(null);
IDが3のレコードを削除:

delete from tb1 where id=3
前の問題を通じて、私達はこの時の自己増ID値は4であることを知っています。
MySQLを再起動します。
現在の自己増値を表示します。

show create table tb1;

#   
CREATE TABLE `tb1` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
3.手動でIDを挿入した後、次回挿入する時の付加価値はいくらですか?
例えば、現在の自己増加IDは4で、新規に記録を挿入する場合は、手動でIDを10と指定し、次回は自己増加方式で挿入する場合は、IDは11です。
ID自増値=現在最大ID+1
新しいレコードを挿入すると、新しいID値が計算されます。
実験
表tb 2を作成し、IDは自己増加します。

create table tb2(id int unsigned auto_increment primary key);
レコードを追加:

insert into tb2 values(null);
手動指定ID:

insert into tb2 values(4294967000);
現在の自己増値を表示します。

show create table tb2;

#   
CREATE TABLE `tb2` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4294967001 DEFAULT CHARSET=latin1
自己増値から4294967001に変わることが見られます。
4.増値してから使ったらどうすればいいですか?
符号なしintの最大値は4294967295で、付加価値がこの値に達した後はそのままです。新たに記録を挿入するとエラーが発生します。
Duplicate entry'4294967295'for key'PRIMARY'
表の記録がよく挿入されたり、削除されたりすると、表の記録の総量が大きくなくても、IDが早く使い切る可能性があります。この場合はビギナートを使う必要があります。
ポイントの範囲:
intは4 byteで、1位は符号を表すものです。
記号付きの範囲:
から  を選択します  - 1
(-2147483648から2147483647まで)
記号なしの範囲:
0から  - 1
(0から4294967295まで)
bigint取得範囲:
intは8 byteです
記号付きの範囲:
から  を選択します  - 1
(-922372036854775808から922323720368775807まで)
記号なしの範囲:
0から  - 1
(0から1846744073709551615まで)
結び目
実験により、InnoDBにおける自己増IDのいくつかの特性が発見された。
新記録を挿入すると、自動IDを使うか、手動でIDを指定するかに関わらず、新たな自己増値(最大ID+1)が計算されます。
最大ID値の削除は自己増ID値には影響がないが、MySQLの再起動後は、使用前の自己増ID値ではなく、最大ID+1を使用する。
IDを増やしてから使ったら変わりません。
締め括りをつける
以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に対して一定の参考学習価値を持ってほしいです。ありがとうございます。