Laravel에서 기존 테이블에 외래 키 제약 조건을 추가 및 삭제하는 방법

이 기사에서는 Laravel 마이그레이션에서 이미 있는 테이블에 외래 키 제약 조건을 추가하는 방법을 설명합니다.

Laravel의 버전은 6 계열입니다.
mysql의 버전은 5.7 계입니다.

>> 프리랜서도 대상! 엔지니어 전직에 추천하는 사이트 5선

다음과 같은 테이블이 있다고 가정합니다.

books 테이블
book_id
book_name

categories 테이블
category_id
category_name

이미 두 마이그레이션이 모두 완료되었지만 books 테이블에 category_id와 외래 키 제약 조건을 추가하고 싶을 때 사용할 수있는 기사입니다.

【완성계】
books 테이블
book_id
book_name
category_id (외래 키 제약)

먼저 열 추가 마이그레이션 파일을 만듭니다.
php artisan make:migration add_category_id_to_books_table --table=books

마이그레이션 파일을 편집합니다.
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class AddCategoryIdToBooksTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('books', function (Blueprint $table) {
            // カラム追加
            $table->bigInteger('category_id')->unsigned()->after('book_name');
            // カラムの外部キー制約追加
            $table->foreign('category_id')->references('category_id')->on('categories')->OnDelete('cascade');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('books', function (Blueprint $table) {
            // 外部キー制約の削除
            $table->dropForeign('books_category_id_foreign');
            // カラムの削除
            $table->dropColumn('category_id');
        });
    }
}

마이그레이션을 수행합니다.
php artisan migrate

이제 외래 키 제약 조건의 열을 추가할 수 있었습니다.


해설


$table->bigInteger('category_id')->unsigned()->after('book_name');
bigInteger('category_id') 는 categories 테이블의 category_id 와 형식을 맞춰야 합니다.

categories 테이블
category_id
category_name

마이그레이션 파일은 기본적으로 다음과 같이 작성되기 때문입니다.
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateCategoriesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('categories', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('categories');
    }
}

categories 테이블의 category_id는 bigIncrements이므로, bigInteger로 하고 있는 것이군요.

laravel5.8 이전의 경우, categories 테이블의 category_id는 increments로 작성됩니다. 이 경우 integer('category_id')여야 합니다.
unsigned()->after('book_name') 의 unsigned() 는 부호 없음, 즉 마이너스의 숫자는 허용하지 않는, 'after('book_name')'로 book_name 컬럼의 뒤에 category_id 컬럼이 추가되도록 지정하고 있습니다.

정리하면
$table->bigInteger('category_id')->unsigned()->after('book_name');

category_id의 컬럼 유형은 bigInteger로 부호가 없으며 book_name 컬럼 다음에 category_id 컬럼을 추가하여 의미합니다.
$table->foreign('category_id')->references('category_id')->on('categories')->OnDelete('cascade');
foreign('category_id')->references('category_id')->on('categories')

외래 키는 category_id이며 참조하는 것은 categories 테이블의 category_id라는 의미입니다.
OnDelete('cascade') 는 정해 불평같은 것으로,
외래 키 제약 조건을 CASCADE 로 설정하면 연결된 레코드를 포함하여 일괄 삭제할 수 있습니다.
            // 外部キー制約の削除
            $table->dropForeign('books_category_id_foreign');
            // カラムの削除
            $table->dropColumn('category_id');

down에는 rollback했을 때의 조작을 씁니다.dropForeign('books_category_id_foreign') 이 부분입니다만,
외래 키를 추가할 테이블 이름_외부 키 이름_foreign으로 설정합니다.

down에 외래 키 제약의 삭제와 컬럼의 삭제를 쓰지 않으면, rollback 할 수 없고 마이그레이션 에러가 되므로, 주의를.

그 외에도 기사 쓰고 있으므로, 꼭 프로필에서 참조하십시오.
· 마이그레이션
· 쿼리 빌더 등
쓰고 있습니다.

기존 테이블에서 외래 키 제약 제거



이미 외래 키 제약 열이있는 테이블에서 외래 키 제약 열을 삭제하고 싶습니다.

우선 마이그레이션 파일을 작성.
php artisan make:migration drop_category_id_to_books_table --table=books

마이그레이션 파일 편집
up에 외래 키 제약 제거를 down으로 rollback 때 실행 취소 처리를 작성합니다.
    public function up()
    {
        Schema::table('books', function (Blueprint $table) {
            // 外部キー制約の削除
            $table->dropForeign('books_category_id_foreign');
            // カラム削除
            $table->dropColumn('category_id');
        });
    }

    public function down()
    {
        Schema::table('books', function (Blueprint $table) {
            // カラムの追加
            $table->unsignedBigInteger('category_id')->after('user_id');
            // 外部キーの追加
            $table->foreign('category_id')->references('category_id')->on('categories');
        });
    }

기존 테이블에서 열을 삭제하고 싶지 않지만 외래 키 제약을 해제하려는 경우



마이그레이션 파일 작성php artisan make:migration drop_foreign_key_to_books_table --table=books
마이그레이션 파일 편집
    public function up()
    {
        Schema::table('books', function (Blueprint $table) {
            // 外部キー制約の削除
            $table->dropForeign('books_category_id_foreign');
        });
    }

    public function down()
    {
        Schema::table('books', function (Blueprint $table) {
            // 外部キーの追加
            $table->foreign('category_id')->references('category_id')->on('categories');
        });
    }

데이터베이스를 확인하면 외래 키 이름 등이 남아 버립니다. 이 경우 다음 SQL을 실행하면 외래 키 이름 등도 사라집니다.

데이터베이스에서 SQL 실행
alter table books
 drop index books_category_id_foreign

>>Laravel의 마이그레이션이 무섭지 않다【작성·컬럼의 추가·삭제】
>>【Laravel 쿼리 빌더】 복수의 컬럼을 groupBy로 그룹화시킨다

>> 프리랜서도 대상! 엔지니어 전직에 추천하는 사이트 5선

좋은 웹페이지 즐겨찾기