MySQLの自己増ID(メインキー)がなくなった解決方法


MySQLには多くの種類の自己増加IDを使用しており、各自己増加IDには初期値が設定されている。一般的に初期値は0から始まり、一定の歩幅で増加します。一般的には、int(11)をデータテーブルの自己増IDとして使用していますが、MySQLではこの数のバイト長が定義されている限り、上限があります。
MySQLの自己増ID(メインキー)がなくなりました。どうすればいいですか?
int unsigned(int,4バイト)を使うと、最大現在の声明の自己増加IDは最大いくらですか?ここで定義されているint unsignedのため、最大で2の32乗-1=4294967295に達することができます。
ここには小さなテクニックがあります。表を作る時に、直接AUTO_を宣言します。INCREMENTの初期値は4294967295です。

create table `test` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4294967295;
SQL挿入文

insert into `test` values (null);
もう一つのデータを挿入しようとしたら、以下の異常結果が得られました。

[SQL] insert into `test` values (null);
[Err] 1062 - Duplicate entry '4294967295' for key 'PRIMARY'
なお、再挿入時に使用される自己増IDは、まだ4294967295であり、主キー競合のエラーを報告している。これは、ID値が上限に達した後には、もはや変化しないことを示している。4294967295、この数字はもう大部分のシーンに対応できます。もしあなたのサービスが頻繁にデータを挿入して削除するなら、やはり使い切るリスクがあります。ビギナートunsignedを採用することを勧めます。この数字は大きいです。
ビギナートunsignedの範囲は-2^63(-922323720368775808)から2^63-1(92232372036854775807)までの整数データ(すべての数字)で、8バイトのサイズが格納されています。
しかし、作成表に主キーが表示されていない場合は、どうなりますか?
この場合、InnoDBは自動的に見えない長さ6バイトのrow_を作成します。id、そしてInnoDBはグローバルなdictsys.row_を維持しました。idなので、メインキーが定義されていないテーブルは全部このrow_を共有しています。IDは、一つのデータを挿入するたびに、グローバルをrow_idはメインキーのIDとして、そしてグローバルなrow_idに1を加える。
この大局はロウドゥですIDはコード実現にbigint unsignedタイプを使用していますが、実際にはrow_のみを与えています。idは6バイトを残していますが、このデザインには問題があります。idはずっと膨張して、ずっと膨張して、2の48べき乗-1の時まで、この時更に+1、row_idの低い48桁は全部0で、結果は新しい行のデータを挿入する時、手に入れたrow_。idは0で、キーが衝突する可能性があります。
したがって、このような隠れた危険を避けるためには、各テーブルにキーを設定する必要があります。
締め括りをつける
データベーステーブルの自己増IDが上限に達してから申請する時の値は変更されません。データを挿入し続けるとメインキーの衝突エラーが発生します。したがって、データテーブルを設計する際には、業務ニーズに応じて、適切なフィールドタイプを選択するようにしています。
以上がMySQLの自己増ID(メインキー)が使い切った解決方法の詳細です。MySQL自己増ID(メインキー)に関する資料は他の関連記事に注目してください。