2017-09-22 31 views
1

私はいつか起こるかもしれない問題について少し研究しています。 idとnameフィールドを持つInnoDB MySQLテーブルがあるとします。 idフィールドはBIGINT(20)を持ち、AUTO_INCREMENTとそれにプライマリキーを加えたものです。自動インクリメントの値が上限に達した場合の対処方法

このテーブルがいっぱいになった場合は、IDの上限に達したことを意味し、自動インクリメント番号はもう生成できません。

+0

'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' –

+1

次に、bigintを符号なしのb igint。それがいっぱいになると、おそらくMySQLデータベースで最も多くのデータを持っているという記録を設定したことになります。あなたがauto_incrementカラムを使いこなしていないと仮定して、それを動作させましょう。私が言っていることは、あなたがそれについて心配する必要がないということです。可能な限り大きなbigint値がどれくらい巨大であるかを見てきましたか?私は、すべてのデータベースユーザーの90%がauto_increment列の32ビット整数の上限に達することはないと言っています。そして、あなたは64ビット値について話しています。 – fancyPants

+0

あなたのシステムは、その番号に達する前に日没になります。 – Juan

答えて

2

はさんのようなテーブル構造を想定してみましょうテーブル内にあり、それらは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^312億)に達した。

列タイプを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`; 
+0

この優れた答えに感謝! :) – Sharpy35

1
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クエリ:あなたはこの番号を達成する前に多分あなたは死んでいるだろう

関連する問題