テーブルのカラムに、後からNot null 制約をつける手順を書いていきます。
まず、新たに Not null 制約を付与するためのマイグレーションファイルを作成します。
rails g migration ChangeCloumnsNotnullAddテーブル名
↓
# rails g migration ChangeCloumnsNotnullAddMovies
マイグレーションファイルを作成
db/migrate/***_change_columns_add_notnull_on_movies.rb
class ChangeCloumnsNotnullAddMovies < ActiveRecord::Migration[6.0]
def change
change_column :users, :title, :string, null: false
change_column :users, :image, :string, null: false
change_column :users, :released_year, :string, null: false
change_column :users, :country, :string, null: false
change_column :users, :screening_time, :string, null: false
change_column :users, :synposis, :string, null: false
end
end
null: false
で制約を付与します
null: true
で制約を付与しません
# rails db:migrate
するとエラーが、、、
# rails db:migrate
== 20220414030927 ChangeCloumnsNotnullAddMovies: migrating ====================
-- change_column(:movies, :title, :string, {:null=>false})
rails aborted!
StandardError: An error has occurred, all later migrations canceled:
Mysql2::Error: Invalid use of NULL value
どうやら既に作ってあるmovieデータの中に、titleに何も指定されてない(null
になっている)ものがあり、このままだとtitleカラムはNot null
にできないということですね。
titleがnull
になっているデータがないか確認してみます。
# rails c
> movies = Movie.all
> movies.find(6)
一つずつmovies.find
で確認してみたところ、movie(id:6)
のデータのtitleがnullになっていました。なのであとはこれを消すだけです。
> Movie.find(6).destroy
無事rails db:migrate
を実行できて、not null制約を付与することができました!