Laravel에서 테이블의 기존 열을 tinyint 형식으로 변경할 수 없는 문제
환경
발생한 문제
DB의 용량을 절약하기 위해 기존 컬럼의 데이터형을 int에서 tinyint로 변경하는 마그레이션을 실행했을 때 아래와 같은 에러가 표시되었다.
「tinyinteger는 컬럼형은 없어」라고 화내고 있기 때문에, 「아, 마이그레이션 파일에 tinyInteger가 아닌 tinyinteger와 타이핑 해 버렸을까」라고 생각해 확인해 보는 것도, 잘못되어 있지 않다.
덧붙여서 마이그레이션 파일의 내용은 이하와 같은 느낌입니다.
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class ChangeContactTypeOfUsers extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->tinyInteger('contact_type')->change();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->integer('contact_type')->change();
});
}
}
원인
Laravel 공식 문서의 Migration 섹션 을 맞추면 다음과 같다.
Only the following column types can be "changed"
의 부분을 일본어 번역하면, 「이하의 컬럼의 형태만이 변경 가능합니다」가 됩니다.
시도해 보면 tinyint에서 다른 유형으로 변경할 수 있었지만 반대로 tinyint로 변경할 수 없었습니다.
즉, Laravel에서는 열의 형태를 tinyint로 변경할 수 없다는 것입니다.
또, 예를 들어 tinyint에서 int로 변경하는 마이그레이션이 통과했다고 해도, 롤백시에는 이끼이기 때문에, tinyint형의 컬럼의 형태 변경은 실시하지 않는 편이 좋을 것입니다.
tinyint로 변경하는 것으로, 격납 가능 사이즈를 초과하는 데이터가 생길 우려가 있기 때문에, 이러한 사양이 되고 있습니까?
자세한 분 계시시면 코멘트에서 교수하실 수 있으면 다행입니다.
대처법
일단 해당 컬럼을 드롭 해, 다시 tinyint형으로서 추가하는 것으로 대처했습니다(이 시점에서는 미사용의 컬럼이었기 때문에).
결국, 형태 변경을 위해서(때문에) 2개의 마이그레이션 파일의 작성이 필요하게 되어 버렸습니다.
※2019/12/4 추가
직장 쪽에 지적해 주셨습니다만, DB 파사드를 이용해 SQL 쿼리를 실행하면 해결하는 문제였습니다.
DB::statement("alter table users modify tel_type tinyint;");
학습
테이블을 만들 때 저장할 수 있는 데이터를 미리 가정하고 적절하게 데이터 유형을 결정해야 한다는 것을 배웠습니다.
참고문헌
Reference
이 문제에 관하여(Laravel에서 테이블의 기존 열을 tinyint 형식으로 변경할 수 없는 문제), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/aikasu/items/e8708e5da29ccc349144텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)