「Duplicate entry ‘1’ for key ‘PRIMARY’」エラーは、データベース(テーブル)に入力しようとしたデータの主キー(idフィールドなど)がすでに使われていることを示しています(重複不可のため)。
エラーの再現
現在、idフィールドには1から5までが使われています。
idが重複するデータを入力します。以下はデータベース管理ツール「phpMyAdmin」での入力例です。
実行すると、主キーが重複するというエラーメッセージが表示されます。
このパターンでエラーメッセージが表示された場合、idフィールドに重複しない値を入力すれば解決です。idフィールドが連番(AUTO_INCREMENT)に設定されている場合、自動で重複しない連番が割り当てられるので、何も入力する必要はありません。
データインポートでエラーになる場合
既存テーブルにデータをインポートするときにこのエラーが発生する場合があります。
たとえば、データをインポートするtable1.sqlに次のように記述されていると、既存のテーブルと主キーが重複するので、エラーになります。
INSERT INTO `table1` (`id`, `nam`, `pre`, `ag`) VALUES(1, '高橋一郎', '鳥取県', 60); INSERT INTO `table1` (`id`, `nam`, `pre`, `ag`) VALUES(2, '近藤次郎', '青森県', 40); INSERT INTO `table1` (`id`, `nam`, `pre`, `ag`) VALUES(3, '山下三郎', '大阪府', 55); INSERT INTO `table1` (`id`, `nam`, `pre`, `ag`) VALUES(4, '新田史郎', '沖縄県', 18); INSERT INTO `table1` (`id`, `nam`, `pre`, `ag`) VALUES(5, '小川五郎', '埼玉県', 30);
エラーを回避するにはINSERT文を変更して、明示的に割り当てられている1から5までのidを「NULL」にします。
INSERT INTO `table1` (`id`, `nam`, `pre`, `ag`) VALUES(NULL, '高橋一郎', '鳥取県', 60); INSERT INTO `table1` (`id`, `nam`, `pre`, `ag`) VALUES(NULL, '近藤次郎', '青森県', 40); INSERT INTO `table1` (`id`, `nam`, `pre`, `ag`) VALUES(NULL, '山下三郎', '大阪府', 55); INSERT INTO `table1` (`id`, `nam`, `pre`, `ag`) VALUES(NULL, '新田史郎', '沖縄県', 18); INSERT INTO `table1` (`id`, `nam`, `pre`, `ag`) VALUES(NULL, '小川五郎', '埼玉県', 30);
インポートを実行すると、連番が自動で割り当てられてデータが追加され、エラーは発生しません。
手作業で1行ずつ修正するのは面倒ですが、エディタの置き換え機能で正規表現を使えば、連番を一括で「NULL」に置き換えることもできます。以下は秀丸エディタで正規表現による置換を行うときの指定例です(3桁までの数値を「NULL」に変更)。