U-Yuri’s 健忘録

U-Yuri’s 備忘録

プログラミングを勉強しています。アウトプットに活用しているブログです。

【sqlite3】元々あるテーブルに追加して外部キーを設定していく方法

■環境
rails
・sqlite3
・あらかじめ外部キーを設定したいテーブルは作成済み

①テーブルを作成(カラムに何も入れずテーブルだけ作成)

$ rails generate model Card_in_deck 

$rails db:migrateでテーブルを作成

ーーーーーーーーーーーFKの設定ーーーーーーーーーーー
③作成したテーブルにカラムを追加する

$ rails generate migrate AddPokemonNoItemsToCardInDeck

db/migrate/~~~~.rbファイルに異kのように外部キーの設定をする

class AddPokemonNoItemsToCardInDeck < ActiveRecord::Migration[7.0]
  def change
    add_reference :card_in_decks, :pokemon_no_items, foreign_key: true
  end
end

※もし上記を書く際間違えた場合は、書き直してdb/schema.rbを削除、rails db:reset実行、rails db:migrateを実行
add_referenceの部分はadd_columnになっていると思うので変更し、2つ目のカラム名もテーブル名に変更する。
type: integerはデフォルトでいいので書かなくて良い。
※また、IDがNULLになって欲しくない場合は、null: falseforeign_key: true,の後に追加。
→テーブルのschemaにnut nullを追加する設定。
$ rails db:migrate
sqlite> .schema card_in_decksでカラムが作成されたか確認。

sqlite> .schema card_in_decks
CREATE TABLE IF NOT EXISTS "card_in_decks" (
"id" integer NOT NULL PRIMARY KEY, 
"created_at" datetime(6) NOT NULL, 
"updated_at" datetime(6) NOT NULL, 
"pokemon_no_items_id" integer DEFAULT NULL, 
CONSTRAINT "fk_rails_e40888835a"FOREIGN KEY ("pokemon_no_items_id")  REFERENCES "pokemon_no_items" ("id")
Us
CREATE INDEX "index_card_in_decks_on_pokemon_no_items_id" ON "card_in_decks" ("pokemon_no_items_id");

※↑見やすいように改行した!
外部キーが作成されているのでOK