안녕하세요. 오늘은 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번의 방법을 사용하였는데, 확실히 라라벨만의 장점인 것 같습니다.