私はいつか起こるかもしれない問題について少し研究しています。 idとnameフィールドを持つInnoDB MySQLテーブルがあるとします。 idフィールドはBIGINT(20)を持ち、AUTO_INCREMENTとそれにプライマリキーを加えたものです。自動インクリメントの値が上限に達した場合の対処方法
このテーブルがいっぱいになった場合は、IDの上限に達したことを意味し、自動インクリメント番号はもう生成できません。
私はいつか起こるかもしれない問題について少し研究しています。 idとnameフィールドを持つInnoDB MySQLテーブルがあるとします。 idフィールドはBIGINT(20)を持ち、AUTO_INCREMENTとそれにプライマリキーを加えたものです。自動インクリメントの値が上限に達した場合の対処方法
このテーブルがいっぱいになった場合は、IDの上限に達したことを意味し、自動インクリメント番号はもう生成できません。
はさんのようなテーブル構造を想定してみましょうテーブル内にあり、それらはINSERT
クエリにも含まれていますが、この特定の問題に何らの価値ももたらさないため、無視しても問題ありません。
列id
の値が最大値に達すると、上記のクエリを使用してテーブルに行を挿入することはできません。次INSERT
はエラーで失敗します。
SQL Error (167): Out of range value for column 'id'.
id
列の値にギャップがある場合、あなたはまだテーブルに存在しない値を使用して行を挿入することができますが、あなたがid
の値を指定する必要がありますクエリINSERT
あなたのAUTO_INCREMENT
列の型がある場合
とにかく、BIGINT
あなたは心配する必要はありません。コードは百万各第にレコードを挿入仮定
(これは不可能と言っていないために、非常に過大評価され)、次half of million yearsためid
列のための十分な値が存在します。列がUNSIGNED
でない場合は、ちょうど292,277
年です。
私は、Webサイトの訪問に関する情報を記録したテーブルのAUTO_INCREMENT
編のPKとしてINT(11)
(やないUNSIGNED
)を使用したライブWebサーバ上で動作を目撃しました。夜中に、スムーズに数年間走った後、訪問数が2^31
(2
億)に達した。
列タイプをINT
からBIGINT
に変更することは、20億レコードテーブルの解決策ではありません(完了までに時間がかかり、システムが稼働しているときに十分な時間がありません)。溶液はなくPK列とAUTO_INCREMENT
カラムの初期値のBIGINT
と同じ構造を持つ新しいテーブルを作成することで、その後表切り替え:
CREATE TABLE `tbl_new` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) AUTO_INCREMENT=2200000000;
RENAME TABLE `tbl` TO `tbl_old`, `tbl_new` TO `tbl`;
この優れた答えに感謝! :) – Sharpy35
tinyint: 1 byte, -128 to +127/0 to 255 (unsigned)
smallint: 2 bytes, -32,768 to +32,767/0 to 65,535 (unsigned)
mediumint: 3 bytes, -8,388,608 to 8,388,607/0 to 16,777,215 (unsigned)
int/integer: 4 bytes, -2,147,483,648 to +2,147,483,647/0 to 4,294,967,295 (unsigned)
bigint: 8 bytes, -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807/0 to 18,446,744,073,709,551,615 (unsigned)
この数字は小さいと思いますか?他の列もある実際のコードで
INSERT INTO tbl(id) VALUES (NULL);
:よう
CREATE TABLE `tbl` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
);
とINSERT
クエリ:あなたはこの番号を達成する前に多分あなたは死んでいるだろう
'code'tinyint:1バイト、-128までを+127/0〜255(符号なし) smallint:2バイト、-32,768〜+32,767/0〜65,535(符号なし) mediumint:3バイト、-8,388,608〜8,388,607〜0〜16,777,215(符号なし) 整数/ 4バイト、-2,147,483,648〜+2,147,483,648〜+2,147,483,647/0〜4,294,967,295 bigint:8バイト、-9,223,372,036,854,775,808〜9,223,372,036,854,775,807/0〜18,446,744,073,709,551,615(符号なし) 'code' –
次に、bigintを符号なしのb igint。それがいっぱいになると、おそらくMySQLデータベースで最も多くのデータを持っているという記録を設定したことになります。あなたがauto_incrementカラムを使いこなしていないと仮定して、それを動作させましょう。私が言っていることは、あなたがそれについて心配する必要がないということです。可能な限り大きなbigint値がどれくらい巨大であるかを見てきましたか?私は、すべてのデータベースユーザーの90%がauto_increment列の32ビット整数の上限に達することはないと言っています。そして、あなたは64ビット値について話しています。 – fancyPants
あなたのシステムは、その番号に達する前に日没になります。 – Juan