エラーの概要
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 | テーブルを作成時に使用されたコメント |