imperish
@imperish

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

rails 初心者 データベースのidを連番にしたい

データベースのidを連番にしたい

とあるモデルのレコードを削除したり追加したりしていると抜け番が発生していて
これを直したいと思っています。
データベースの管理にはsqlite3を使っています。

そもそもの原因は何でしょうか。

そもそもの原因は何でしょうか。
レコードを削除したり追加したりしているとどうしても抜け番が発生するものなのでしょうか。
それとも私のモデル生成方法に問題があるのでしょうか。

一応、該当するmigrateファイル

class CreateNewLives < ActiveRecord::Migration[6.0]
  def change
    create_table :new_lives do |t|
      t.string :name
      t.integer :tika
      t.integer :tian
      t.integer :kyori

      t.timestamps
    end
  end
end

id抜け番の解決方法

自分で考えた解決方法としては
1,1から生成、または1つずつ編集
2,sql文を使ってsqlを操作し、解決
3,DB Browser for sqliteなどを使ってデータベースを編集、CSVファイル生成しそれを適応する。

1は自分の力でもなんとかなりそうですが、今回、こうして質問させて頂いているのは、
この問題の解決方法として、もっと一般的な、もっとスマートな方法があると、
確信し、それを身に着けておきたいからです。
ですのでこの方法はできれば取りたくないです。

2は例えばhttps://qiita.com/chokosuki4400/items/eb943b29e832ba315b9f
このページのような方法などを取るのが良いのかなと思いました。

3は例えばhttps://qiita.com/Ryuta1346/items/c21cb70b9879c66c8639
このようなページを参考にしようかと思いました。

この手の問題はよくあるようで調べるとたくさん解決方法が出てきましたが、
どれを取ればいいのか、分からず、どれも今一しっくりこなかったので、
今回、質問させて頂くに至りました。

他にもっといい案がありましたら、教えて頂きたいです。

また、私の方で足りない情報がありましたらご一報くださりますと、すぐ用意しますので、
仰っていただければ幸いです。

よろしくお願いします。

0

3Answer

INTEGER 型の主キーに AUTOINCREMENT が設定されているとそうなります。

そういう主キーはテーブルのレコードを一意に識別するためだけのもので、それ以上でもそれ以下でもなく、連番にしようなどとはゆめゆめ思わないことをお勧めします。

連番が必要なら別の手段を考えた方が良さそうです。

2Like

Comments

  1. @imperish

    Questioner

    返答して頂き、ありがとうございます。
    分かりました。
    そうですね、連番であることに依存しないコードを考えてみます。
    ありがとうございました!

レコードを削除したり追加したりしているとどうしても抜け番が発生するものなのでしょうか。

このとおりです。

idの連番具合に依存しないプログラムを書いておけばOKです。

1Like

Comments

  1. @imperish

    Questioner

    ご回答ありがとうございます。
    やってみたら若干無理矢理ですが解決しました。
    感謝です!

書籍「SQLアンチパターン」の購入を強くオススメします。
このことについても詳しく取り上げている他、これにひっかかるエンジニアがおそらく引っかかるだろう他の問題についても記載されています。

1Like

Your answer might help someone💌