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선
Reference
이 문제에 관하여(Laravel에서 기존 테이블에 외래 키 제약 조건을 추가 및 삭제하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kamome_susume/items/67ab3c47b7f9fecfb04a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)