課題
laravelのマイグレーション実行時、複数カラムのunique制約を削除する際、以下のようなエラーが発生して正しく削除されない事があります。
SQLSTATE[HY000]: General error: 1553 Cannot drop index 'identity_providers_user_id_provider_name_unique':needed in a foreign key constraint (SQL: alter table `table_name` drop index `identity_providers_user_id_provider_name_unique`)
unique制約を削除したい対象が外部キー制約も適用されている場合、外部キー制約を先に削除する必要があります。
解決方法
先に外部キー制約を削除してからunique制約を削除するようにします。
例えば、以下ようなケースの場合、マイグレーションはこのように記述します。
- identity_providersテーブルにuser_id, provider_nameに対して複合ユニークが適用されている
- user_idカラムにはUsersテーブルに外部キー制約が適用されている
public function up()
{
Schema::table('identity_providers', function (Blueprint $table) {
$table->dropForeign(['user_id']); // 外部キー制約を削除する
$table->dropUnique(['user_id', 'provider_name']); // user_idとprovider_nameのユニークを削除する
$table->foreign('user_id')->references('id')->on('users'); // 外部キー制約を再度適用する
});
}