2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Mysql2::Error: Duplicate entry 'xxx' for key 'PRIMARY' エラー解決方法

Last updated at Posted at 2022-02-01

エラーの概要

Mysql2::Error: Duplicate entry '100018' for key 'PRIMARY'と表示され、レコードを追加することができず、、
エラーメッセージから主キーが重複しているということは理解できたが、該当の主キーとは何なのか、、

そんな中、無事解決できたので備忘録としてまとめておきます。

結論から、AUTO_INCREMENT属性を該当テーブルのidに設定していたため、レコード作成時にMySQLが自動的にid番号を割り当てていたことによる重複が原因でした。

実装箇所をテストしていた際に、誤って操作したことによるものだと思われます、、反省。

前提

  • OS:MAC
  • DB:MySQL
  • TablePlusを使用してDBデータを確認しています。

1.AUTO_INCREMENTの値を確認する

取得する該当テーブルを指定してテーブルデータを確認してみました。

  • TablePlusの操作
  • 左上のSQLをクリック
  • コマンドを入力し、⌘ + Enterで実行
-- 構文
SHOW TABLE STATUS LIKE ('テーブル名');

-- 出力コマンド
SHOW TABLE STATUS LIKE 'orders';
=> 100017

出力結果からAUTO_INCREMENTの値が100017であることが確認できました。

2.最大値のレコードを取得

今回の場合、PRIMARYキーidカラムの重複が原因のため、該当カラムの最大値レコード数を取得してみました。

SELECT MAX(id) FROM orders;
=> 100133

出力結果からテーブルに存在する1番最後のレコードのid100133であることが確認できました。

本来なら、次に作成されるレコードのidには100134が付与されるのだが、どういうことかid100018が付与されてしまい、「 重複してるー 」とエラーメッセージが表示されていたんですね、、

3.次回レコード作成時のAUTO_INCREMENTの値を確認

TablePlusで確認することができます。

  • TablePlusの操作
  • 左上のitemsをクリックし、該当テーブルを選択する。
  • 画面下にあるStructureをクリックする。
  • 表示されたinfoをクリックし、1番下までスクロールすると確認できます。
ENGINE=InnoDB AUTO_INCREMENT=100018 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='xxx';

確認したところ、100018と表示されており、本来は100134である必要があります。

4.AUTO_INCREMENTの値を変更

最後に、正しい値をALTER文で変更していきます。

ALTER TABLE orders AUTO_INCREMENT = 100134;

出力後

ENGINE=InnoDB AUTO_INCREMENT=100134 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='xxx';

先ほど TablePlus で確認したAUTO_INCREMENTの値が反映されていることが分かります。

その結果、無事新規レコードを作成することに成功!

最後に

解決できたときの達成感って格別ですよね笑

SHOW TABLE STATUS で 取得できるデータ

【ストレージエンジンがInnoDBの場合】

項目        情報
Name テーブル名
Engine テーブルのストレージエンジン名
Version テーブルの .frm file. のバージョン番号
Row_format レコードの保存形式
Rows レコードの行数
Avg_row_length レコードの平均行長
Data_length クラスタ化されたインデックスに割り当てられるおおよその容量 (バイト単位)
Max_data_length 未使用
Index_length クラスタ化されていないインデックスに割り当てられる領域の概算量 (バイト単位)
Data_free 割り当てられているが、使用されていないバイト数
Auto_increment 次のAUTO_INCREMENT値
Create_time テーブル作成時刻
Update_time データファイルの最新更新時刻
Check_time 最後にチェックされた時刻
Collation テーブルのデフォルトの照合
Checksum ライブチェックサム値
Create_options パーティションテーブルの partitioned が表示(CREATE TABLE で使用される追加のオプション)
Comment テーブルを作成時に使用されたコメント

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?