Error기록 노트/PHP | Laravel

[Laravel 9 + Mysql] unique key, primary key, foreign key 등 제약키 수정방법

에러노트 2023. 1. 3. 20:31

안녕하세요. 오늘은 migration 수정하면서 데이터를 날려버릴 수도 없고(!!!)

어떻게든 제약키를 해제하는 방법을 찾아 방황한 에러노트입니다.

재밌게도 laravel은 create는 참 쉬운데 수정은 일부러 쉽지 않게 만들어졌다는 사실, 알고계신가요?

저도 삽질하면서 이번에 새로 알게 되었답니다.


 

우선, 수정을 하는 방법은 크게 나누어보자면 2가지 입니다.

 

1. 쿼리문을 통해 직접적으로 데이터베이스에서 수정하는 방법

  • 직접 쿼리문을 작성하여 수정하는 방식.
  • 제약조건이 다양할 경우, 주변 제약조건도 함께 삭제하는 등 수정의 순서가 있어 복잡함.
  • Mysql, Oracle 등등 문법이 조금씩 다르기 때문에 그에 대한 지식이 요구됨.

 

2. migration을 통해 수정하는 방법

  • laravel 내에서 수정이 가능.
  • 제약조건의 순서에 상관없이 수정이 용이함.
  • 어느정도 migration에 대한 지식이 요구됨.

 

저는 이 중 2번을 통해 수정해보았습니다.

migration의 이미 만들어둔 create 테이블은 그대로 두고, 새로 하나를 만들어 줍니다.

//저는 생성용 테이블과의 구별을 위해 이름 첫부분은 update로 작성하였습니다.
php artisan make:migration update_delete_table;

이제 생성한 수정용 테이블에서 수정/삭제하기 위한 구문을 작성해줍시다.

저의 경우, brand_name의 unique key를 제거하고, price의 not null을 null로 수정하고자 하였기에 다음과 같이 작성하였습니다.

 public function up()
    {
        Schema::table('products',function (Blueprint $table){
            $table->dropUnique(['brand_name']);
            $table->integer('price')->nullable()->change();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('products', function (Blueprint $table) {
            $table->string('brand_name')->unique()->change();
        });
    }
};

up()만 작성한 것이 아닌 down()도 작성한 것을 알 수 있죠? 저는 있던 조건을 삭제하는 것이기에 ->unique()->change();로 작성하였습니다. 그냥 ->change();로 하면 적용이 되지 않았습니다.

자, 그 후 터미널을 열어줍니다.

php artisan migrate

그 후 상태를 보니,

바로 해결이 되지 않고 에러가 발생하였죠? 제가 맨 처음에 언급했던 말 기억하시나요? 네, 라라벨은 수정/삭제가 쉽지 않다는 이유가 바로 여기서 나옵니다. 라라벨은 수정/삭제에 관한 패키지가 기본으로 깔려있지 않고 이렇게 에러를 통해 install하라고 알려줍니다. 한번 더 생각하라는 의미에서 말이죠.

전 오류에 적힌대로 install을 해주었습니다.

install 후, 다시 migrate 하면 정상적으로 수정이 완료된 것을 알 수 있었습니다.

저는 sql 구문을 통해 관련 제약조건을 같이 삭제했다 다시 생성하는게 너무 어렵고 복잡하여 2번의 방법을 사용하였는데, 확실히 라라벨만의 장점인 것 같습니다.