<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>仙人の心得 &#187; sutoincrement</title>
	<atom:link href="http://blog.mktime.com/archive/tag/sutoincrement/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.mktime.com</link>
	<description>修行の日々を淡々と</description>
	<lastBuildDate>Thu, 05 May 2011 07:39:25 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>MySQL:auto_incrementが最大値まで達したとき</title>
		<link>http://blog.mktime.com/archive/46.html</link>
		<comments>http://blog.mktime.com/archive/46.html#comments</comments>
		<pubDate>Sun, 27 Jul 2008 14:07:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[bigint]]></category>
		<category><![CDATA[int]]></category>
		<category><![CDATA[sutoincrement]]></category>

		<guid isPermaLink="false">http://blog.mktime.com/?p=46</guid>
		<description><![CDATA[auto_incrementにしたカラムの型がintなら2147483647、bigintなら9223372036854775807がautoincrementの最大になる。 実際に最大値までauto_incrementを進めてみる。 ALTER TABLE table1 AUTO_INCREMENT= 2147483647; auto_incrementが最大値に達するともうそのテーブルには行を追加することはできなくなります。 oracleのシーケンスならCYCLEオプションがあるけどmysqlのauto_incrementにはそのような機能は無いらしい。 ではauto_incrementが最大値に達したとき、どうすればよいのか？ 単純に ALTER TABLE table1 AUTO_INCREMENT= 1; としても、table1に1より大きいキーが存在する限りauto_incrementは1に戻らない。 DELETE FROM table1; --データを全部消す。 ALTER TABLE table1 AUTO_INCREMENT= 1; ならばauto_incrementは1に戻るので、循環シーケンスと似たような動きにするにはINSERTトリガーで 1. 対象テーブルのauto_increment値が最大に達しているかチェック。最大なら2.へ 2. 対象テーブルのデータを別テーブルに退避 3. 対象テーブルのデータをDELETE 4. ALTER TABLE～でauto_incrementを初期値に設定 という流れになるけど、INSERTの度に1.のチェックを走らせるのはちょっと嫌（1/2147483647の為に余計な処理を入れたくない）。また、退避後のデータをどう扱うかも微妙（UNIONするにしても別のキーが要るし・・・）だから int autoincrementでキーの枯渇が心配ならbigint型にしたほうがよいと思う。 bigintの最大値は9223372036854775807。intの約42億倍もある。 これは1日に1億個のキーを消費しても2億年持つという計算になる。]]></description>
			<content:encoded><![CDATA[<p>auto_incrementにしたカラムの型がintなら2147483647、bigintなら9223372036854775807がautoincrementの最大になる。</p>
<p>実際に最大値までauto_incrementを進めてみる。</p>
<pre class="console">
 ALTER TABLE table1 AUTO_INCREMENT= 2147483647;
</pre>
<p>auto_incrementが最大値に達するともうそのテーブルには行を追加することはできなくなります。</p>
<p>oracleのシーケンスならCYCLEオプションがあるけどmysqlのauto_incrementにはそのような機能は無いらしい。</p>
<p>ではauto_incrementが最大値に達したとき、どうすればよいのか？</p>
<p>単純に</p>
<pre class="console">
 ALTER TABLE table1 AUTO_INCREMENT= 1;
</pre>
<p>としても、table1に1より大きいキーが存在する限りauto_incrementは1に戻らない。</p>
<pre class="console">
 DELETE FROM table1; --データを全部消す。
 ALTER TABLE table1 AUTO_INCREMENT= 1;
</pre>
<p>ならばauto_incrementは1に戻るので、循環シーケンスと似たような動きにするにはINSERTトリガーで</p>
<p>1. 対象テーブルのauto_increment値が最大に達しているかチェック。最大なら2.へ<br />
2. 対象テーブルのデータを別テーブルに退避<br />
3. 対象テーブルのデータをDELETE<br />
4. ALTER TABLE～でauto_incrementを初期値に設定</p>
<p>という流れになるけど、INSERTの度に1.のチェックを走らせるのはちょっと嫌（1/2147483647の為に余計な処理を入れたくない）。また、退避後のデータをどう扱うかも微妙（UNIONするにしても別のキーが要るし・・・）だから<br />
int autoincrementでキーの枯渇が心配ならbigint型にしたほうがよいと思う。<br />
bigintの最大値は9223372036854775807。intの約42億倍もある。<br />
これは1日に1億個のキーを消費しても2億年持つという計算になる。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mktime.com/archive/46.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

