다음과 같이 마이그레이션을 사용하여 테이블을 만들었습니다.
public function up()
{
Schema::create('despatch_discrepancies', function($table) {
$table->increments('id')->unsigned();
$table->integer('pick_id')->unsigned();
$table->foreign('pick_id')->references('id')->on('picks');
$table->integer('pick_detail_id')->unsigned();
$table->foreign('pick_detail_id')->references('id')->on('pick_details');
$table->integer('original_qty')->unsigned();
$table->integer('shipped_qty')->unsigned();
});
}
public function down()
{
Schema::drop('despatch_discrepancies');
}
이 테이블을 변경하고 외래 키 참조 및 열을 삭제 pick_detail_id
하고 열 sku
뒤에 호출되는 새 varchar 열을 추가해야합니다 pick_id
.
그래서 다음과 같은 또 다른 마이그레이션을 만들었습니다.
public function up()
{
Schema::table('despatch_discrepancies', function($table)
{
$table->dropForeign('pick_detail_id');
$table->dropColumn('pick_detail_id');
$table->string('sku', 20)->after('pick_id');
});
}
public function down()
{
Schema::table('despatch_discrepancies', function($table)
{
$table->integer('pick_detail_id')->unsigned();
$table->foreign('pick_detail_id')->references('id')->on('pick_details');
$table->dropColumn('sku');
});
}
이 마이그레이션을 실행할 때 다음 오류가 발생합니다.
[Illuminate \ Database \ QueryException]
SQLSTATE [HY000] : 일반 오류 : 1025 ‘./dev_iwms_reboot/despatch_discrepancies’이름을 ‘./dev_iwms_reboot/#sql2-67c-17c464′(오류 번호 : 152)로 바꿀 때 1025 오류 발생 (SQL : alter table
despatch_discrepancies
외래 키 pick_detail_id 삭제)[PDOException]
SQLSTATE [HY000] : 일반 오류 : 1025 ‘./dev_iwms_reboot/despatch_discrepancies’이름을 ‘./dev_iwms_reboot/#sql2-67c-17c464’로 이름을 바꿀 때 오류가 발생했습니다 (오류 번호 : 152).
php artisan migrate:rollback
명령 을 실행하여이 마이그레이션을 되돌리려 고하면 Rolled back
메시지 가 표시되지만 실제로 데이터베이스에서 아무 작업도 수행하지 않습니다.
무엇이 잘못되었는지 아십니까? 외래 키 참조가있는 열을 어떻게 삭제합니까?
답변
이것을 사용할 수 있습니다 :
$table->dropForeign(['pick_detail_id']);
$table->dropColumn('pick_detail_id');
dropForeign 소스에서 정점을 찍으면 열 이름을 배열로 전달하면 외래 키 인덱스 이름이 빌드됩니다.
답변
그것은 밝혀; 다음과 같은 외래 키를 만들 때 :
$table->integer('pick_detail_id')->unsigned();
$table->foreign('pick_detail_id')->references('id')->on('pick_details');
Laravel은 다음과 같이 외래 키 참조의 이름을 고유하게 지정합니다.
<table_name>_<foreign_table_name>_<column_name>_foreign
despatch_discrepancies_pick_detail_id_foreign (in my case)
따라서 외래 키 참조가있는 열을 삭제하려면 다음과 같이해야합니다.
$table->dropForeign('despatch_discrepancies_pick_detail_id_foreign');
$table->dropColumn('pick_detail_id');
최신 정보:
Laravel 4.2+는 새로운 명명 규칙을 도입합니다.
<table_name>_<column_name>_foreign
답변
내 테이블에 여러 외래 키가 있었고 열 이름을 배열의 인덱스로 전달하여 외래 키 제약 조건을 하나씩 제거해야했습니다.
public function up()
{
Schema::table('offices', function (Blueprint $table) {
$table->unsignedInteger('country_id')->nullable();
$table->foreign('country_id')
->references('id')
->on('countries')
->onDelete('cascade');
$table->unsignedInteger('stateprovince_id')->nullable();
$table->foreign('stateprovince_id')
->references('id')
->on('stateprovince')
->onDelete('cascade');
$table->unsignedInteger('city_id')->nullable();
$table->foreign('city_id')
->references('id')
->on('cities')
->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('offices', function (Blueprint $table) {
$table->dropForeign(['country_id']);
$table->dropForeign(['stateprovince_id']);
$table->dropForeign(['city_id']);
$table->dropColumn(['country_id','stateprovince_id','city_id']);
});
}
아래 문을 사용하면 작동하지 않습니다.
$table->dropForeign(['country_id','stateprovince_id','city_id']);
dropForeign은 제거하려는 별도의 열을 고려하지 않기 때문입니다. 그래서 우리는 그것들을 하나씩 떨어 뜨려야합니다.
답변
이 문제를 해결하기위한 핵심은 $ table-> dropForeign () 명령이 반드시 열 이름이 아니라 올바른 관계 이름을 전달하고 있는지 확인하는 것이 었습니다. 당신은 할 수 없습니다 만큼 직관적 이럴 것, 열 이름을 전달하려는.
나를 위해 일한 것은 다음과 같습니다.
$table->dropForeign('local_table_foreign_id_foreign');
$table->column('foreign_id');
그래서 나를 위해 일한 dropForeign ()에 전달한 문자열은 다음과 같은 형식이었습니다.
[로컬 테이블] _ [외래 키 필드] _foreign
Sequel Pro 또는 Navicat과 같은 도구에 액세스 할 수있는 경우이를 시각화 할 수 있으면 매우 유용합니다.
답변
나에게 일어난 일은 Schema::table
블록을 어디에 둘지 몰랐다는 것 입니다.
나중에 키가 SQL 오류에 있음을 발견했습니다.
[Illuminate\Database\QueryException]
SQLSTATE[23000]: Integrity constraint violation: 1217 Cannot delete or update a parent row: a foreign key constraint fails (SQL: drop table if exists `lu_benefits_categories`)
따라서 Schema::table
블록 down()
은 lu_benefits_categories
마이그레이션 기능에서 다음 Schema::dropIfExists
행 앞에 있어야 합니다.
public function down()
{
Schema::table('table', function (Blueprint $table) {
$table->dropForeign('table_category_id_foreign');
$table->dropColumn('category_id');
});
Schema::dropIfExists('lu_benefits_categories');
}
그 후, php artisan migrate:refresh
또는 php artisan migrate:reset
트릭을 할 것입니다.