4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

laravelマイグレーションで複数カラムのunique制約を削除する方法

Posted at

課題

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'); // 外部キー制約を再度適用する
        });
    }
4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?