タグアーカイブ MySQL

WordPressでデータベース接続確立エラーが出た時の直し方

WordPressで「データベース接続確立エラー」が表示される原因は、wp-config.phpファイル内のデータベース接続情報の誤り、またはデータベースサーバー自体の停止に大別される。まずはこの二点を順に確認すれば、大半のケースは解決する。

エラーメッセージが示す根本的な原因は二つだけ

エラーメッセージが示す根本的な原因は二つだけ

WordPressのインストール時や運用中に「データベース接続確立エラー」というメッセージが表示された場合、WordPressは設定ファイルに書かれた情報でMySQL(またはMariaDB)データベースへ接続できていない。エラー画面にも表示される通り、原因は大きく分けて次の二つだ。

  • 認証情報の不一致(wp-config.phpのデータベース名、ユーザー名、パスワード、ホスト名のいずれかが間違っている)
  • データベースサーバーに接続できない(サーバーが停止している、ネットワーク障害がある、ホスト名が間違っている)

新規インストール直後のエラーでは設定ミスが大半を占め、運用中のサイトで突然発生した場合はサーバー側の一時的なトラブルや、何らかの設定変更が影響している可能性が高い。いずれにせよ、対処のステップは決まっている。

エラー 「データベース接続確立エラー」が画面に表示される
認証情報 確認

wp-config.phpのDB_NAME・DB_USER・DB_PASSWORD・DB_HOSTを再チェック

サーバー 確認

データベースサーバーが稼働しているか、管理画面から確認

エラー状態  認証情報の確認  サーバー稼働の確認

最初に確認すべきwp-config.phpの設定

最初に確認すべきwp-config.phpの設定

データベース接続情報を記述するwp-config.phpは、WordPressのルートディレクトリに設置されている。エラーが起きたら、まずこのファイルの中身をファイルマネージャーやFTPで開き、以下の4項目が正しいか確認する。

データベース名(DB_NAME)の確認

DB_NAMEには、使用するデータベースの正確な名前を指定する。多くのレンタルサーバーでは、契約時に自動生成されたデータベース名にアカウント名のプレフィックスが付与される(例: username_wp001)。phpMyAdminやサーバー管理画面のMySQLデータベース一覧に表示される名前と、一字一句たがわず一致させる必要がある。大文字小文字も区別されるため、コピー&ペーストで転記するのが確実だ。

ユーザー名(DB_USER)とパスワード(DB_PASSWORD)の精査

データベースに接続するためのユーザー名とパスワードも同様に、サーバー側で作成したMySQLユーザーの情報と完全一致させる。パスワードは暗号化されずに平文で記述されるため、見間違いがないか注意する。また、パスワードに特殊文字(’ ” \ $ など)が含まれていると、PHPが正しく解釈できず接続エラーを引き起こすことがある。必要に応じてシングルクォーテーションで囲む、あるいはパスワード自体を英数字のみの強固なものに変更するのも有効な手段だ。

ホスト名(DB_HOST)の指定

DB_HOSTは、WordPressがデータベースサーバーを探しに行く宛先だ。多くの共用サーバーでは localhost で問題ない。しかし、一部のホスティング環境では、データベースサーバーがWebサーバーとは別のマシンで動作しており、専用のホスト名やIPアドレスが割り当てられている。サーバー会社のマニュアルに記載されているホスト名(例: mysql.example.com)を指定する。稀に 127.0.0.1 で接続できるが localhost だとエラーになるケースもあるため、どちらも試す価値がある。

Before(エラー発生時)
define( 'DB_NAME', 'wordpress' ); /* ← 実在しないDB名 */
define( 'DB_PASSWORD', 'mypassword' ); /* ← 誤ったパスワード */
After(修正後)
define( 'DB_NAME', 'user_wp01' ); /* ← 正しいDB名 */
define( 'DB_PASSWORD', 'C0rrect!Pass#' ); /* ← 正しいパスワード */

データベースサーバーが稼働しているか確認する

データベースサーバーが稼働しているか確認する

wp-config.phpの設定が正しいのにエラーが続く場合、問題はデータベースサーバー側にある。まず、利用しているホスティングサービスの管理画面にログインし、MySQLやデータベースのセクションを確認する。

サーバー管理画面からの状況確認

多くのレンタルサーバーでは、cPanelや独自のコントロールパネルからMySQLサーバーの稼働状況や、データベースの一覧、ユーザー管理が行える。対象のデータベースとユーザーが存在し、かつユーザーに適切な権限が付与されているかを確認する。サーバー会社によっては、メンテナンスや障害発生時にステータスページで告知を行っているため、そちらも合わせてチェックする。

phpMyAdminで直接ログインを試みる

サーバーの管理画面からphpMyAdminを起動し、wp-config.phpで指定したのと同じユーザー名とパスワードでログインできるか試す。ログインできればデータベースサーバー自体は稼働しており、認証情報も正しいことになる。ログインに失敗する場合は、パスワードのリセットやユーザーの再作成を検討する。ローカル環境(LocalWPやXAMPPなど)で作業している場合は、MySQLサービスが起動しているか、タスクマネージャーやサービス一覧で確認する。

STEP 1 サーバー管理画面にログインし、MySQLの項目を開く
STEP 2 データベースとユーザーが存在し、リンクされているか確認
STEP 3 phpMyAdminで同じ認証情報を使ってログインできるかテスト
STEP 4 接続できればデータベースは正常、できなければユーザーの再作成を検討

それでも解決しない場合の追加確認項目

それでも解決しない場合の追加確認項目

上記の確認で問題が見つからない場合、より深い部分に原因が潜んでいる。以下の点を順に見ていく。

データベースユーザーの権限を再確認する

MySQLユーザーがデータベースにアクセスするための権限が不足していると、WordPressはテーブルを作成・読み取りできず接続エラーを起こす。phpMyAdminやサーバー管理画面で、該当ユーザーに「ALL PRIVILEGES」が付与されているか確認する。特にデータベースを移行した直後や、手動でユーザーを作成した場合に起こりやすい。

データベースの破損をチェックする

サーバーの突然の停止やディスク障害により、MySQLのテーブルが破損することがある。phpMyAdminで該当データベースを選択し、すべてのテーブルをチェックして「テーブルの修復」を実行する。WordPressが管理画面にアクセスできる状態であれば、wp-config.phpに define('WP_ALLOW_REPAIR', true); を一時的に追記し、http://example.com/wp-admin/maint/repair.php にアクセスして修復する手段もある。修復後は必ずこの行を削除する。

wp-content/db.php ファイルの存在を疑う

一部のキャッシュプラグインやデータベース置き換えプラグインは、/wp-content/db.php というファイルを作成してWordPress標準のデータベース接続処理を上書きする。このファイルが破損していたり、古い設定を保持したままだと、突然データベース接続エラーを引き起こす。FTPでdb.phpを一時的に別名にリネームし、エラーが消えるか確認する。

マルチサイトのwp-config.php設定を見直す

WordPressのマルチサイト(サブディレクトリ型やサブドメイン型)を運用している場合、wp-config.phpにマルチサイト固有の定義定数が正しく記述されている必要がある。DOMAIN_CURRENT_SITESUBDOMAIN_INSTALL の値が、実際のURL構成やサーバー設定と矛盾していると、内部的なデータベースクエリが失敗して接続エラーに見えることがある。マルチサイト化した直後や、ドメインを変更した後にエラーが起きた場合は、この設定を疑う。

よくある質問

wp-config.phpの修正後にエラーが変わらないのはなぜか

修正内容を保存しても、サーバーのキャッシュやCDN(コンテンツデリバリネットワーク / 配信網)が古いエラー画面を表示し続けることがある。スーパーリロード(Ctrl+F5やCommand+Shift+R)を試し、それでも変わらなければキャッシュ系プラグインを一時停止するか、サーバー側のキャッシュを管理画面からクリアする。

パスワードやユーザー名は合っているのに接続できない

MySQLユーザーが特定のIPアドレスからの接続に制限されている可能性がある。レンタルサーバーでは「localhost」専用のユーザーが作成されるが、外部から接続するように変更してしまうとWebサーバーからのローカル接続が拒否される。phpMyAdminのユーザーアカウント管理で、ホスト名が「localhost」または「127.0.0.1」になっているか確認する。

レンタルサーバーのサポートに連絡するタイミングはいつか

自身でwp-config.phpの設定確認、phpMyAdminからのログインテスト、管理画面からのデータベース稼働状況確認を行っても解決しない場合は、サーバー側の障害や特殊な構成が原因である可能性が高い。サーバー会社のサポートに「WordPressのデータベース接続確立エラーが出ている」「MySQLに接続できない」と具体的に伝えて調査を依頼する。その際、エラーメッセージのスクリーンショットがあるとスムーズだ。

ローカル環境で同じエラーが出る場合の対処法は

LocalWPやXAMPP、MAMPなどのローカル開発環境では、MySQL(またはMariaDB)のサービスが停止していることが原因の大半を占める。各ツールの管理画面で「Start」ボタンを押してサービスを起動し直すか、OSのシステムトレイから再起動する。ポートの競合(特に3306番)が原因で起動に失敗しているケースもあるため、エラーログを確認する。

データベースの修復をしてもすぐにエラーが再発する

テーブルの修復が一時しのぎで終わる場合、ストレージのディスク容量不足や、ハードウェア的な障害が進行している可能性を疑う。サーバーのディスク使用率を確認し、不要なバックアップやログを整理する。根本的にはホスティングサービスのプラン見直しや、サーバー移転を検討する必要がある。

この記事のポイント

  • データベース接続エラーの原因は「認証情報の不一致」と「サーバー停止」に絞られる
  • wp-config.phpのDB_NAME・DB_USER・DB_PASSWORD・DB_HOSTを最初に確認する
  • phpMyAdminで同じ認証情報を用いて直接ログインし、サーバー稼働をテストする
  • 解決しない場合はユーザー権限・DB破損・db.phpの競合・マルチサイト設定を順に疑う
  • サーバー側の障害が疑われる場合は、ログやディスク容量を確認しサポートに連絡する
WordPressで「Duplicate entry」データベースエラーが出た時の原因と直し方

WordPressで「Duplicate entry」データベースエラーが出た時の原因と直し方

プラグイン更新後に debug.log へ「WordPress database error Duplicate entry」が大量出力される問題は、テーブルに一意キーを追加する際、既存データに空の値や重複が存在するために起きている。このエラーそのものはサイトの表示を直ちに壊すわけではないが、ログファイルが急激に肥大化してサーバーのディスク容量を圧迫するため、早期の対処が必要だ。

なぜこのエラーが発生するのか

なぜこのエラーが発生するのか

プラグインのバージョンアップで、データベースのテーブル構造(スキーマ)が変更されることがある。今回のように wp_blc_links テーブルに url_hash カラムを追加し、さらにそのカラムへ UNIQUE KEY(一意キー制約)を設定しようとした場合、既存のレコードの中に同一のハッシュ値が重複していると「Duplicate entry」エラーが発生する。

とりわけ問題になるのが、ハッシュ値が空文字列(空の値)のまま残っているレコードだ。空文字列どうしも「同じ値」とみなされるため、一意キー制約に違反してエラーとなる。これは Broken Link Checker に限らず、データベースのスキーマ変更をともなうあらゆるプラグインで起こりうる。

エラーメッセージの後半に「for key 'wp_blc_links.url_hash'」と表示されているなら、url_hash 列の重複が原因と特定できる。この情報を手がかりに、次の対処へ進む。

まずはログの肥大化を止める

まずはログの肥大化を止める

このエラーはサイトの表示に影響を与えないケースが多いが、放置すると debug.log が一晩で数百 MB に膨れ上がる。ディスク容量が尽きればサイト全体が停止するため、真っ先にログ出力を食い止める必要がある。

プラグインを前のバージョンに戻す

最も確実なのは、問題が発生しなかった旧バージョンへ差し戻す方法だ。プラグインの公式ページにある「以前のバージョン」セクションからダウンロードし、手動でアップロードして上書きする。WordPress 管理画面の「プラグイン」→「新規追加」→「プラグインのアップロード」から ZIP ファイルを指定すればよい。

プラグインを一時的に無効化する

旧バージョンの入手が難しい場合や、そもそもこのプラグインがサイト運営に必須でなければ、無効化するだけでログ出力は止まる。「プラグイン」→「インストール済みプラグイン」から該当プラグインを無効化するだけだ。無効化しても、これまでに収集されたリンク切れのデータはデータベースに残るため、後で有効化すれば以前の状態から再開できる。

Before(エラー発生中)
プラグイン v2.4.9 有効化された状態
debug.log へ毎秒数百件の重複エラーが記録される
→ 数時間で数百 MB に肥大化
After(対処後)
プラグイン 旧バージョン または無効化
debug.log へのエラー出力が停止
→ ログファイルは正常サイズを維持
エラー出力が続く状態  対処後(ログ出力停止)

上図は、プラグインのバージョンを戻すか無効化する前後でのログ出力の変化を表している。どちらの方法でも、エラーの無限出力はすぐに止められる。

データベースの重複を手動で修正する

データベースの重複を手動で修正する

プラグインの新バージョンを使い続けたい場合や、修正パッチのリリースを待たずに根本解決したい場合は、データベースを直接操作して重複レコードを削除する方法がある。ただし、操作を誤るとサイト全体に影響が出るため、必ず事前にデータベースのバックアップを取得しておく。

phpMyAdmin から重複行を特定して削除する

レンタルサーバーの管理画面から phpMyAdmin を開き、該当の WordPress データベースを選択する。wp_blc_links テーブル(接頭辞は環境により異なる)を表示し、「SQL」タブで次のクエリを実行すると、url_hash が空のレコードと重複しているレコードを確認できる。

SELECT url_hash, COUNT(*) 
FROM wp_blc_links 
GROUP BY url_hash 
HAVING COUNT(*) > 1;

このクエリで表示される行が、一意キー制約に違反する重複レコードだ。続けて、重複しているレコードのうち不要なものを削除する。url_hash が空文字列のレコードをすべて削除してしまえば、多くのケースでエラーは解消する。

DELETE FROM wp_blc_links WHERE url_hash = '';

削除後、プラグインを最新バージョンにアップデートするか、一度無効化してから再度有効化すれば、テーブルのスキーマ変更が正常に完了する。エラーログへの出力も止まるはずだ。

WP-CLI が使える環境での対処

サーバーに SSH 接続でき、WP-CLI がインストールされているなら、コマンドラインからより安全に操作できる。まずは重複を確認する。

wp db query "SELECT url_hash, COUNT(*) FROM wp_blc_links GROUP BY url_hash HAVING COUNT(*) > 1;"

問題が確認できたら、同様に空ハッシュのレコードを削除する。

wp db query "DELETE FROM wp_blc_links WHERE url_hash = '';"

操作後はプラグインを再有効化し、debug.log からエラーが消えたことを確認する。WP-CLI を使う最大の利点は、誤って操作しても wp db export で事前にバックアップを取りやすく、復旧が容易な点だ。

再発防止と注意点

再発防止と注意点

プラグインのアップデートは自動更新に任せず、可能であればステージング環境で事前にテストする運用が望ましい。とくにデータベースのスキーマ変更をともなうアップデート(変更履歴に「database」「schema」「table」「column」といった単語が見られるもの)は要注意だ。

また、debug.log が常に有効になっている環境では、定期的にログファイルのサイズを確認し、不要になったら削除する習慣をつけておくと、ディスク容量の急激な枯渇を防げる。wp-config.phpWP_DEBUG_LOGtrue にしている場合は、開発やトラブル解決時以外は false に戻しておくのも有効な対策だ。

よくある質問

重複レコードを削除してもプラグインの機能に影響はないのか

空のハッシュ値を持つレコードは、もともと正常にリンクチェックが機能していないデータだ。削除しても、プラグインは次回のクロール時に改めてリンクを検査して正しいハッシュ値を再生成するため、実害はない。むしろ重複が解消されることで、後続のアップデートも正常に完了するようになる。

このエラーを放置するとどうなるのか

エラーそのものはサイトのフロントエンド表示に影響しない場合が多いが、debug.log がサーバーのディスク容量を圧迫し、最悪の場合「ディスクフル」でサイト全体がダウンする。また、プラグインのスキーマ変更が完了しないため、以降のアップデートが正常に適用されず、プラグインの一部機能が動作しない状態が続く可能性もある。

Broken Link Checker 以外のプラグインでも同じエラーは起こるのか

起こる。UNIQUE KEY を追加するデータベーススキーマの変更を行うプラグインであれば、同種のエラーが発生しうる。SEO プラグインやセキュリティプラグインの大規模アップデートでも見られるため、エラーメッセージに表示されるテーブル名とカラム名を手がかりにして、同じ手順で対処できる。

phpMyAdmin を使えない場合はどうすればよいか

「WP Data Access」や「Advanced Database Cleaner」のようなデータベース操作ができるプラグインを一時的にインストールして、SQL クエリを実行する方法がある。あるいは、サーバー会社のサポートに依頼して重複レコードの削除を代行してもらうのも一つの手だ。

修正パッチがリリースされるまでのつなぎ対策は

プラグインを旧バージョンに固定し、WordPress 管理画面の「プラグイン」→「インストール済みプラグイン」で該当プラグインの自動更新をオフにしておく。公式の変更履歴を定期的にチェックし、修正が含まれたバージョンがリリースされたら手動でアップデートすればよい。

この記事のポイント

  • 「Duplicate entry」エラーは、一意キー制約の追加時に既存データの重複が原因で発生する
  • 緊急対応として、プラグインを旧バージョンに戻すか一時的に無効化する
  • データベースから重複レコードを削除すれば、最新バージョンでも正常動作する
  • 事前のバックアップ取得と、ステージング環境でのテストが再発防止に有効
WordPressで「Duplicate entry ‘0’ for key ‘PRIMARY’」エラーが発生したときのデータベース修復手順

WordPressで「Duplicate entry ‘0’ for key ‘PRIMARY’」エラーが発生したときのデータベース修復手順

MailPoetなどのプラグインで「An exception occurred while executing a query: Duplicate entry ‘0’ for key ‘PRIMARY’」というエラーが発生しプラグインを再インストールしても直らない場合、原因はデータベーステーブルの主キーからAUTO_INCREMENT属性が失われていることだ。phpMyAdminでテーブル構造を直接修復すれば解決する。

なぜ再インストールではこのエラーが直らないのか

なぜ再インストールではこのエラーが直らないのか

「Duplicate entry ‘0’ for key ‘PRIMARY’」は、データベースの主キー(PRIMARY KEY)に同じ値「0」を重複して挿入しようとしたときにMySQLが返すエラーだ。通常、主キーにはAUTO_INCREMENTが設定されており、新しい行が追加されるたびに自動で一意の番号(1、2、3…)が振られる。しかしテーブル構造が破損したり、何らかの操作でAUTO_INCREMENT属性が外れたりすると、WordPressやプラグインは新しい行を追加する際に主キーへ「0」や重複した値を挿入しようとして失敗する。

MailPoetを管理画面から削除して再インストールしても、プラグインが使用するカスタムテーブルは削除されずに残ることが多い。テーブルが残っていれば破損した構造もそのままだ。結果として、何度インストールし直しても同じエラーが再発するという状況に陥る。

Before(破損したテーブル)
問題主キーにAUTO_INCREMENTが無い
id INT(11) NOT NULL
↑ AUTO_INCREMENTが欠落
→ 新規行のidが常に0になる
After(修復後のテーブル)
解決AUTO_INCREMENTが有効
id INT(11) NOT NULL AUTO_INCREMENT
↑ 自動で一意の番号が振られる
→ 正常にデータを追加できる
エラー状態  修正後

エラーが発生しているテーブルは、エラーメッセージに直接表示されないことも多い。MailPoetの場合、mailpoet_で始まる複数のテーブルのいずれかでこの問題が起きている可能性が高い。具体的にはmailpoet_subscribersmailpoet_segmentsなど、データを頻繁に追加するテーブルで発生しやすい。

phpMyAdminでデータベーステーブルを修復する手順

phpMyAdminでデータベーステーブルを修復する手順

レンタルサーバーの管理画面からphpMyAdminにアクセスし、以下の手順でテーブル構造を修復する。操作は数分で完了し、特別な技術知識は不要だ。

STEP 1 サーバー管理画面からphpMyAdminを開く
STEP 2 左側メニューからWordPressのデータベースを選択
STEP 3 MailPoetテーブルの「構造」タブを開きAUTO_INCREMENTを確認・再設定
STEP 4 WordPress管理画面でプラグインが正常動作するか確認

対象のデータベースとテーブルを特定する

phpMyAdminを開いたら、左側のデータベース一覧からWordPressサイトが使用しているデータベースをクリックする。データベース名がわからない場合は、WordPressインストールディレクトリのwp-config.phpファイルを開き、DB_NAMEの値を確認する。またはサーバー管理画面の「データベース」セクションでWordPressに関連付けられたデータベース名を探す。

データベースを選択するとテーブルの一覧が表示される。MailPoetのテーブルはmailpoet_という接頭辞で始まる(例:wp_mailpoet_subscriberswp_mailpoet_newslettersなど)。エラーの原因となっているテーブルを特定するには、まずmailpoet_subscribersなど主要なテーブルの「構造」タブを開き、主キー(通常はidカラム)の「AUTO_INCREMENT」が有効かどうかを確認する。

主キーにAUTO_INCREMENTを再設定する具体的なSQL操作

テーブルの「構造」タブでidカラムの「変更」リンク(鉛筆アイコン)をクリックする。表示された編集画面で「A_I」(AUTO_INCREMENT)チェックボックスにチェックを入れ、「保存」をクリックする。これで主キーにAUTO_INCREMENT属性が再設定される。

もしphpMyAdminのGUI操作でエラーが出る場合は、SQLタブを開いて直接SQL文を実行する。以下のSQLを実行する(テーブル名は実際のものに置き換える)。

ALTER TABLE wp_mailpoet_subscribers MODIFY COLUMN id INT(11) NOT NULL AUTO_INCREMENT;

このSQL文は、wp_mailpoet_subscribersテーブルのidカラムをAUTO_INCREMENT付きで再定義する。同じ問題が他のMailPoetテーブルでも発生している可能性があるため、mailpoet_で始まるすべてのテーブルの構造を確認し、idカラムのAUTO_INCREMENTが外れているものがあれば同様に修正する。

操作後はphpMyAdminの「操作」タブから、そのテーブルのAUTO_INCREMENTの現在値を適切な値に設定しておくとより安全だ。テーブル内の既存データの最大IDより大きい値(例:既存の最大IDが150なら151)をAUTO_INCREMENT欄に入力して「実行」をクリックする。

データベースに直接アクセスできない場合の代替手段

レンタルサーバーによってはphpMyAdminが提供されていなかったり、セキュリティ上の理由でデータベースへの直接アクセスが制限されている場合がある。その場合は以下の方法を試す。

WP-CLIが利用できる環境なら、以下のコマンドでデータベースに直接SQLを実行できる。

wp db query "ALTER TABLE wp_mailpoet_subscribers MODIFY COLUMN id INT(11) NOT NULL AUTO_INCREMENT;"

WP-CLIもphpMyAdminも使えない共有サーバーの場合は、「Advanced Database Cleaner」や「WP-DBManager」のようなWordPressプラグインを使ってSQLクエリを実行する方法もある。ただし多くのレンタルサーバーにはphpMyAdminが標準で用意されているため、まずはサーバー管理画面を確認するのが確実だ。

MailPoetテーブルを完全にリセットして再インストールする方法

MailPoetテーブルを完全にリセットして再インストールする方法

テーブル構造の修復が難しい場合や、破損が広範囲に及んでいる場合は、MailPoetの全テーブルを手動で削除してからプラグインを再インストールする方法もある。この方法では既存の購読者データやニュースレターの設定は失われるため、事前にバックアップがある場合のみ選択する。

全リセットの手順
① phpMyAdminでDROP TABLE を実行
mailpoet_ で始まる全テーブルを削除
② WordPress管理画面からMailPoetを削除
プラグイン一覧で「削除」をクリック
③ MailPoetを新規インストール
プラグイン新規追加から再インストール

テーブルを削除するには、phpMyAdminで各mailpoet_テーブルにチェックを入れ、下部の「処理」ドロップダウンから「削除(DROP)」を選択して実行する。MailPoetのテーブルは数が多いため、一つずつ選択するか、以下のようなSQLを実行して一括削除することもできる。

DROP TABLE IF EXISTS wp_mailpoet_subscribers, wp_mailpoet_segments, wp_mailpoet_newsletters;

すべてのMailPoetテーブル名はphpMyAdminのテーブル一覧で確認できる。DROP TABLEは取り消せない操作のため、実行前に必ずデータベース全体のバックアップ(エクスポート)を取得する。その後WordPress管理画面からMailPoetプラグインを削除し、改めて「プラグイン」→「新規追加」からインストールすれば、正常なテーブル構造でプラグインが初期化される。

他のプラグインでも発生する同様のエラーと共通の対処法

他のプラグインでも発生する同様のエラーと共通の対処法

「Duplicate entry ‘0’ for key ‘PRIMARY’」はMailPoetに限らず、WooCommerce、BuddyPress、LearnDashなど、独自のカスタムテーブルを作成するあらゆるプラグインで発生する可能性がある。根本原因は常に同じで、主キーのAUTO_INCREMENT属性が失われていることだ。

WooCommerceの場合はwp_woocommerce_order_itemswp_woocommerce_downloadable_product_permissionsなど、BuddyPressではwp_bp_activitywp_bp_notificationsで発生しやすい。エラーメッセージが表示されたら、まずメッセージ内で言及されているクエリからテーブル名を特定し、そのテーブルの主キー構造をphpMyAdminで確認する手順は同じだ。

プラグイン別の代表的なエラー対象テーブル
WooCommerce
wp_woocommerce_order_items
BuddyPress
wp_bp_activity
LearnDash
wp_learndash_user_activity

WordPressのメジャーアップデートやサーバーのMySQLバージョンアップグレード後にこのエラーが突然発生した場合は、複数のカスタムテーブルで同様の破損が起きている可能性が高い。その際は一つずつ修復するよりも、データベース全体のバックアップを取った上で、DB管理ツールの「テーブルの修復」機能を使うのが効率的だ。phpMyAdminではデータベースを選択後、全テーブルにチェックを入れて「処理」から「テーブルの修復」を選択すると、破損したテーブルを一括で修復できる。

今後の再発を防ぐための予防策

AUTO_INCREMENT属性が外れる根本原因は、MySQLの不整合やプラグインの不完全なアップデート処理にあることが多い。完全に防ぐことは難しいが、以下の対策でリスクを低減できる。

プラグインのアップデート前にデータベースのバックアップを必ず取得する習慣をつける。多くのレンタルサーバーでは管理画面からワンクリックでバックアップを取得できる。また「UpdraftPlus」などのバックアッププラグインを導入し、自動バックアップをスケジュールしておくと、問題発生時に迅速に復元できる。

プラグインのメジャーアップデート(1.xから2.xなど大幅なバージョンアップ)を適用する際は、可能であればステージング環境で事前テストを行う。これにより本番環境でテーブル破損が発生するリスクを大幅に減らせる。ステージング機能を提供しているレンタルサーバーも増えている。

よくある質問

エラーメッセージにテーブル名が表示されない場合はどうすればいいか

WordPressのデバッグモードを有効にすると、より詳細なエラー情報が表示される。wp-config.phpにdefine('WP_DEBUG', true);define('WP_DEBUG_LOG', true);を追加し、wp-content/debug.logに出力されるエラーログを確認する。ログにはクエリ全体が記録されるため、テーブル名が特定できる。

phpMyAdminでAUTO_INCREMENTのチェックボックスがグレーアウトして変更できない

主キーが正しく設定されていない可能性がある。まず「構造」タブでidカラムが「PRIMARY」と表示されているか確認する。表示されていない場合は、そのテーブルのSQLタブでALTER TABLE テーブル名 ADD PRIMARY KEY (id);を実行してから再度AUTO_INCREMENTの設定を試す。

テーブルを修復したが同じエラーが別のテーブルで発生する

プラグインが使用する全テーブルを確認する必要がある。MailPoetは40以上のテーブルを使用しており、idカラムを持つテーブルすべてで同様の問題が起きている可能性がある。phpMyAdminの検索機能で「id」を含むテーブル構造を横断的に確認するか、前述の全テーブル削除と再インストールを検討する。

データベース操作に不慣れでSQLの実行が不安な場合の安全な方法はあるか

レンタルサーバーのサポートに依頼するのが最も安全だ。「WordPressプラグインのデータベーステーブルでAUTO_INCREMENTが破損しているため修復してほしい」と伝えれば、多くのサーバー会社では技術サポートが対応してくれる。またphpMyAdminの「エクスポート」で事前にSQLバックアップを取得しておけば、操作ミスがあっても復元できる。

この記事のポイント

  • 「Duplicate entry ‘0’ for key ‘PRIMARY’」は主キーのAUTO_INCREMENT属性欠落が原因
  • プラグイン再インストールだけではテーブル構造は修復されない
  • phpMyAdminで対象テーブルのidカラムにAUTO_INCREMENTを再設定すれば解決する
  • MailPoet以外のプラグイン(WooCommerce、BuddyPress等)でも同じ対処法が有効
  • 事前のデータベースバックアップとデバッグモード活用で早期発見と安全な修復が可能