wp_optionsやwp_postmeta等の番号を振りなおす

WordPressを使用していると、データベースのwp_optionsテーブルやwp_postmetaテーブルが大きくなってきます。それとともに、記事の更新などによりIDがとびとびになってきます。そんな時、IDを連番に付け直す方法のメモです。 ## 方法 データベースを操作しますので、事前にバックアップを取ります。そのあと、SQL文を実行します。 なお、「wp_postsテーブルのID」や「wp_termsテーブルのterm_id」などは、他のテーブルから参照されているため、単純に変更することはできません。 ### options テーブル名がwp_optionsの場合
# 番号を振りなおす
SET @n := 0;
UPDATE wp_options SET option_id = (@n := @n +1) ORDER BY option_id;

# AUTO_INCREMENTを変更(自動的に最大値+1になる)
ALTER TABLE wp_options AUTO_INCREMENT = 1;
### postmeta テーブル名がwp_postmetaの場合
# 番号を振りなおす
SET @n := 0;
UPDATE wp_postmeta SET meta_id = (@n := @n +1)  ORDER BY meta_id;

# AUTO_INCREMENTを変更(自動的に最大値+1になる)
ALTER TABLE wp_postmeta AUTO_INCREMENT = 1;
### メモ AUTO_INCREMENTの値は次のように取り扱われます。 > 新しい行に使用される AUTO_INCREMENT カウンタの値を変更するには、次のようにします。 > ALTER TABLE t2 AUTO_INCREMENT = value; > このカウンタを、現在使用されている値以下の値にリセットすることはできません。InnoDB と MyISAM のどちらの場合も、この値が現在 AUTO_INCREMENT カラム内にある最大値以下である場合、この値は現在の AUTO_INCREMENT カラムの最大値に 1 を加えた値にリセットされます。 引用元:MySQL 5.6 リファレンスマニュアル - ALTER TABLE 構文 http://dev.mysql.com/doc/refman/5.6/ja/alter-table.html このためvalueに1を指定しておけば、最大値+1の値にリセットできます。
# AUTO_INCREMENTを変更(自動的に最大値+1になる)
ALTER TABLE wp_options AUTO_INCREMENT = 1;
しかし以前のInnoDBは動作が異なり、最大値より小さい値を指定すると変更されませんでした。この場合は、次のような方法があります。
# 番号を振りなおす
SET @n := 0;
UPDATE wp_options SET option_id = (@n := @n +1) ORDER BY option_id;

# AUTO_INCREMENTを変更
SET @sql := CONCAT('ALTER TABLE wp_options AUTO_INCREMENT = ', @n +1);
PREPARE change_auto_increment FROM @sql;
EXECUTE change_auto_increment;
DEALLOCATE PREPARE change_auto_increment;
なお、phpMyAdminではテーブルの「操作」タブの「AUTO_INCREMENT」欄から変更することもできます。