質問: ### やりたいこと すでにいくつかDBにレコードが登録されているとして、その途中にひとつレコードを挿入し、かつ、idはよしなに並べ替えてくれるみたいなことがしたいです。 ### 具体例 下記のようなusersテーブルがあったとして、主キーであるidが1と2の間にレコードを挿入したい、かつ、idもうまいことずらしてくれる。 みたいなことを想定しています。 ``` |id|name| |1 |fuga| |2 |hoge| |3 |piyo| ``` (挿入後) ``` |id|name| |1 |fuga| |2 |fizz| <=== 挿入する, hogeのidは3に、piyoのidは4にする |3 |hoge| |4 |piyo| ``` ### 考えたこと upsert_allを使えばレコード自体の更新はできるものの、idの並び替えがどうやってやればいいのか分からず、何かヒントになるメソッドや方法を知っている方がいらっしゃいましたら教えていただけると助かります。よろしくお願いします。
回答: Wikipedia英語版Primary keyより: > > (前略) In the ORM like active record pattern, these additional restrictions are placed on primary keys: > > > * Primary keys should be immutable, that is, never changed or re-used; they should be deleted along with the associated record. > > > (後略) > > > ORMapper が暗に `id` のような人工キー(surrogate key)を主キーとして要求しているのは、主キーの不変性を保証することで、レコードのコントロールを容易にするためです。 したがって、人工キーを主キーに設定しているにもかかわらず変更したい、という質問文の要求は奇妙であり、目的達成のために行おうとしている手段を誤っているのではと考えます。 質問文中に目的が書かれていないので明確に回答はできませんが、 `id` 以外のカラム(例えば`ソーオーダー`)で実現すべきものかと思います。 この場合、例えば次のリンクのような設計を行うことで、既存のレコードの値を更新することなく、既存のレコードの間に新規レコードを差し込めるかと思います。 * RESTful な並び替え実装の個人的ベストプラクティス - Qiita