エラーの概要
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番最後のレコードのidが100133であることが確認できました。
本来なら、次に作成されるレコードのidには100134が付与されるのだが、どういうことかidに100018が付与されてしまい、「 重複してるー 」とエラーメッセージが表示されていたんですね、、
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 | テーブルを作成時に使用されたコメント |