[MySQL] idを詰める(連番を振り直す)方法とAUTO_INCREMENTのリセット [DB]

この記事は約3分で読めます。
スポンサーリンク

当サイトには広告が含まれています。

数分毎に定期的にログを取得するようなプログラムを書き、DBに格納し始める。

だが、ログが膨大になったのでスリム化したい。

数分毎なので1日に多数のレコードがあるが、内容(atai)を調べると、その中の1つだけで事足りる場合。

[test_db_001]

id,date,time,atai
1,2015-01-01,00:10:00,10
2,2015-01-01,00:20:00,10
3,2015-01-01,00:30:00,10
4,2015-01-02,00:10:00,20
5,2015-01-02,00:20:00,20
6,2015-01-02,00:30:00,20

「その中の1つだけで事足りる」というのは、値は常に変化するが、その動きが小さいため、どれか1つのレコードを抜き出しても問題ないような種のデータである。

まずは年月日(date)でSELECTして抽出する。

SELECT * FROM `test_db_001` GROUP BY `date` ORDER BY `id` ASC ;

# 但しこの文でSELECTできるのは、dateが2015-01-01であればid(1,2,3)のどれであるかは不明なので、明確にするならそれに適したSELECT文を書くこと。

結果、id(1,4)が選択される。

[test_db_001]

id,date,time,atai
1,2015-01-01,00:10:00,10
4,2015-01-02,00:10:00,20

この状態でexportし、別名(test_db_002)でimportする(copyでも可)。

しかし、これではidに隙間が生じており、使いにくい。

システムがidに依存しない場合、これを詰めてしまおう。

SET @i := 0 ;必須
UPDATE `test_db_002` SET id = (@i := @i +1) ;

これで、以下のようにidを詰める(連番の振り直し)ことができる。

[test_db_002]

id,date,time,atai
1,2015-01-01,00:10:00,10
2,2015-01-02,00:10:00,20

ここでAUTO_INCREMENTを変えることを忘れないように。

この場合では、最終のidが2なので、次のid(AUTO_INCREMENT)は3になる。

若しくは、次の値を調べなくても、

ALTER TABLE `テーブル名` AUTO_INCREMENT = 1 ;

で良い。

AUTO_INCREMENTに最小の「1」を指定してあるが、実行時点で最大idが4の場合、最小(1)を指定することで、自動的に5が設定される(エラーにもならない)ので、この方が楽。

つまり、下記をセットで実行すればよい。

SET @i := 0 ;
UPDATE `テーブル名` SET `id` = (@i := @i + 1) ;
ALTER TABLE `テーブル名` AUTO_INCREMENT = 1 ;

そして、test_db_002をtest_db_001にリネームして終了。

phpMyAdminが使える環境であれば、簡単な操作で実行可能だ。

exportもimportも画面上部から可能であり、SQL文(UPDATE…)の実行も、画面上部にある「SQL」で可能。

AUTO_INCREMENTとリネームは、画面上部の「操作」にある。

操作

上述したように、格納済の最大idが4の時に、この画面で1を入れて実行すると、自動的に5が設定される。

なお、テーブル自体を空にする(TRUNCATE TABLE)と、連動してAUTO_INCREMENTが1に設定される(別操作は不要)。

元の(膨大な)ログが必要であれば、リネームするかexportするなどして保存しておくこと。

タイトルとURLをコピーしました