質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

1357閲覧

Railsでmysqlのテーブルのauto incrementがリセットされてしまう問題

kuuritar

総合スコア38

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

1クリップ

投稿2018/11/11 15:18

編集2018/11/12 01:26

Railsで全テーブル物理削除の構成でmysqlを利用して、アプリケーションを作っているのですが、削除されたidが再利用される現象が起きています。

例: レコードinsert -> id: 1 レコードinsert -> id: 2 id: 2のレコード削除 レコードinsert -> id: 2

mysqlをSQL等で直接いじることはしていなく、全てRailsで操作しています。

production環境で起きているので、何が原因か探りたいのですがログからでは全く追えず・・・

Railsでこのような設計をしているとdestroy時にauto incrementがリセットされる(idの最大値の+1になる)よ!等の情報を持っている方がいればぜひ教えてください。

(auto incrementの値がリセットされているかはmysqlから確認しました)

早速の回答ありがとうございます。以下に追記させていただきます。

試したこと

>1,2とあって2を削除したとき この場合は2が削除され、リセットされる問題が起きた場合は2が再度挿入されます。 >1,2,3とあって1を削除したとき この場合はリセットされる問題が起きた場合でも1が入ることはなく、次のinsertでは4が入ります。 >1,2,3とあって2を削除したとき 上記同様次のinsertは4が入ります。 >1,2,3とあって3を削除したとき この場合は2が削除され、リセットされる問題が起きた場合は3が再度挿入されます。

実はある程度の期間運用(と言っても自分の趣味のサービスで事業等ではないです)しており、いくつか起きています。
そして毎回リセットされるわけではなく、気づいたらリセットされている・・・と言った感じでトリガーがわかっていない状況です。
毎回リセットされているわけではないので、今
削除 -> 追加
を行ってもどのパターンでもリセットされているような挙動はしません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/11/11 15:24 編集

1,2とあって2を削除したとき、1,2,3とあって1を削除したとき2を削除したとき3を削除したとき それぞれどのような結果となるか質問本文に「試したこと」として追記してください。※Ruby明るくないのであくまで問題切り分けのために試していただきたいことです
guest

回答1

0

ベストアンサー

AUTO_INCREMENTが最大値+1なので、最後の番号を削除すれば、当然最大値は変わります。
最大値の番号でないものを削除しても最大値は変化しません。

再起動が絡みますが、MYSQLの仕様です。
14.6.5.1 従来の InnoDB の自動インクリメントロック

MySQL サーバーを再起動するとAUTO_INCREMENT の値が戻る

AUTO_INCREMENTした値が一意であることを見越して、
他のテーブルの外部キーにしてたりすると、整合性が取れなくなってしまう。

対策としては
・外部キー制約入れる
・AUTO_INCREMENTに頼らず、別に採番テーブルを用意する
・論理削除してレコードを delete しない(!)

8.0だと解消しているようです。
MySQL 8.0でInnoDBのAUTO_INCREMENT問題解消を確認してみる

投稿2018/11/11 23:56

編集2018/11/12 01:43
sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuuritar

2018/11/12 01:28

>AUTO_INCREMENTが最大値+1なので、最後の番号を削除すれば、当然最大値は変わります。 通常であれば例に書いてあることを実行すれば次にinsertされるのはid: 3の値ではないですか? 実際に試してもそうなりました。 最大値が変わるのは最適化等が行われた時とかではないですかね?
sazi

2018/11/12 01:43

追記しました。
kuuritar

2018/11/12 03:28 編集

ありがとうございます。 やはり再起動なのですかね… 再起動を手動で実行したことはないのですが、AWSのRDSが勝手に再起動されることがあるんですかね…
sazi

2018/11/12 03:48 編集

この際、再起動の発生する要因を追及したところで、今後手動も含めて再起動を行わないようにできるはずもなく、8.0未満では、この事象が起きることを前提に対処するしかありません。
sazi

2018/11/12 03:54 編集

そもそもこの事象が起きて困る事って何なのでしょう? 外部キーということなら、参照先を先に削除していないってことでしょうから、仕組みに不備があるって事ですし、残すなら、論理削除での対処が必要で、それも設計時の検討不足ですし。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問