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」欄から変更することもできます。