ことれいのもり

「SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'xxx' for key 'xxx'.」 のエラーが出る原因と対処法

はじめに

PHPでSQLを使っているときに、次にエラーが表示されたことはありませんか?


SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1' for key 'slug'


この記事では、このエラーが何を意味しているか、そしてどう対処すればいいかを解説します。

対処法

このエラーは「あるカラムに同じ値を2回入れようとしてしまった」場合に発生します。

例えば、次のようなエラーが出たとします


SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1' for key 'slug'


このメッセージを分解してみましょう。


Duplicate entry '1': '1'という値

for key 'slug': 'slug'というカラム(またはインデックス) に対して

入力しようとしたところ、すでにその値が存在していたため、UNIQUE制約に違反してエラーになった、という意味です。


つまり、'slug'に'1'という値を入れようとしたが、すでに同じ

slug='1'

のデータが存在していた、ということです。

UNIQUE制約とは?

UNIQUE制約とは、「特定のカラムの値は、他の値と重複してはいけない」 という制約のことです。


例えば、ユーザー登録時に「email」カラムにUNIQUE制約をつけると、同じメールアドレスで複数のユーザーを登録できなくなります。

これは、ユーザーを一意に登録するためや、URLの重複を防ぐなど、「同じ値が連続すると困る場面」 でよく使われます。


主に、以下のようなカラムに使われます。

  • email: ユーザーの識別
  • username: ログイン名の重複防止
  • slug: 記事のURLを一意にする

おわりに

ちなみに私の場合は、記事のURLに使う 'slug' が毎回 '1' になっており、同じ値を登録しようとしてエラーになっていました。

この場合は、データベースから 'slug' の値を書き換えることで解決しました。


自作CMSを使っているのですが、CMSの管理画面からは slug の値が変更できないようになっていたため、将来的には管理画面から 'slug' を編集できるように改善する予定です。