LoginSignup
2
1

More than 3 years have passed since last update.

Laravel カラム追加時にでたエラーNot null violation: 7 ERROR:

Last updated at Posted at 2021-04-12

やりたいこと

"posts"テーブルに"part"というカラムを追加する。

使用環境

OS
docker
DB:postgres:12
デプロイ先:Heroku

つまづいたところ

php artisan migrateコマンド実行でエラー

$ docker-compose exec app sh //dockerコンテナに入るコマンド
/app# php artisan migrate 

SQLSTATE[23502]: Not null violation: 7 ERROR:  column "part" contains null values (SQL: alter table "posts" add column "part" varchar(255) not null)

エラーをよむ:新しく追加したカラム "part"はnull値を含んでいる。
(SQL: alter table "posts" add column "part" varchar(255) not null)
テーブルは追加カラム(varchar(255)=string)をnot nullで追加した

/app # php artisan migrate:status
+------+------------------------------------------------+-------+
| Ran? | Migration                                      | Batch |
+------+------------------------------------------------+-------+
| Yes  | 2014_10_12_000000_create_users_table           | 1     |
| Yes  | 2014_10_12_100000_create_password_resets_table | 1     |
| Yes  | 2019_08_19_000000_create_failed_jobs_table     | 1     |
| Yes  | 2021_04_02_083813_create_posts_table           | 1     |
| No   | 2021_04_10_202701_add_user_id_to_posts_table   |       |
+------+------------------------------------------------+-------+

migration状況確認。
Noになっています。

解決方法

app # php artisan migrate:refresh

すべてのマイグレーションをロールバックしmigrateを実行。
反映されました!!

Docker

Docker開発環境でpsqlにアクセスの仕方が分からなかったので;;
本番環境(Heroku)で確認

$ heroku pg:psql
:DATABASE=> \d posts
                                          Table "public.posts"
   Column   |              Type              | Collation | Nullable |              Default              
------------+--------------------------------+-----------+----------+-----------------------------------
 id         | bigint                         |           | not null | nextval('posts_id_seq'::regclass)
 title      | character varying(255)         |           | not null | 
 created_at | timestamp(0) without time zone |           |          | 
 updated_at | timestamp(0) without time zone |           |          | 
 user_id    | integer                        |           |          | 
 part       | character varying(255)         |           | not null | 

Nullable欄にnot nullと表記されている。
migrationファイルにnullable();と指定しない場合は、勝手にnot null制約をつけてくれる模様。

因みに...

$ heroku run php artisan migrate:fresh
Dropped all tables successfully.
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
//省略

とmigrate:refreshではなく、freshで全てのテーブルを削除しmigrateを実行でも大丈夫だった。
違いはdownの処理を行ってからmigrationするか、テーブルを全削除してから1からmigrationするか、らしいがここの使い分けは今はピンときていない。

参考URL

マイグレーション生成:LaravelドキュメントURL

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1