【问题标题】:I can't drop unique index我不能删除唯一索引
【发布时间】:2019-01-13 10:52:59
【问题描述】:

我创建了唯一索引:

 $table->unique(['owner_id', 'promoter_id']);

现在我把它扔掉了

$table->dropUnique(['owner_id', 'promoter_id']);

一般错误:1553 无法删除索引 'connections_owner_id_promoter_id_unique':在外键中需要 约束(SQL:alter table connections 删除索引 connections_owner_id_promoter_id_unique)

另外,我之前尝试过删除外键

$table->dropForeign('connections_promoter_id_foreign');

但还是没有结果

【问题讨论】:

  • 那是因为外键的名字是connections_owner_id_promoter_id_unique,错误告诉你
  • @DouwedeHaan 但是我怎么能放弃它(独特的),我知道错误在说什么,但我不知道我该如何解决
  • $table->dropForeign('connections_owner_id_promoter_id_unique');
  • @DouwedeHaan 这也不起作用,我仍然收到错误(不同),该密钥不存在 语法错误或访问冲突:1091 Can't DROP 'connections_owner_id_promoter_id_unique';检查列/键是否存在(SQL:alter table connections drop foreign key connections_owner_id_promoter_id_unique
  • 您能否向我们提供您要更改的表及其相关表的所有迁移?

标签: php mysql laravel laravel-5 laravel-5.6


【解决方案1】:

Laravel docs on Indexes,您可以创建具有指定名称的唯一索引:

所以为了省去调试 laravel 如何为索引构造名称的麻烦,你可以在添加索引时为其指定一个名称,例如:

$table->unique(['owner_id', 'promoter_id'], 'owner_promoter_index');

然后当你放下它时,你使用相同的名字:

$table->dropUnique('owner_promoter_index');

【讨论】:

  • 谢谢,这似乎可行,但为此我需要为旧迁移添加索引
  • @napalias 如果它们没有给您带来问题,您不必为较旧的迁移执行此操作。对我来说,给索引一个我选择的名称(当出现问题时)让我确信正在使用正确的名称,因此如果之后出现另一个问题,我可以从根本原因中排除索引命名。
【解决方案2】:

基于这个Drop muli-column unique key without dropping foreign key?,我得到了这个同样有效的解决方案:

Schema::table('connections', function ($table){
            $table->index('owner_id');
            $table->dropUnique(['owner_id', 'promoter_id']);
        });

【讨论】:

    【解决方案3】:

    先删除约束。

    对于 sqlserver: 如果你不知道约束名,使用sp_helpconstraint TABLE_A,约束名可能和index一样。 然后alter table TABLE_A drop constraint UQ__TABLE_A_XXXXXXXXXX。然后,删除索引。

    【讨论】:

      【解决方案4】:

      在你的例子中

      $table->unique(['owner_id', 'promoter_id']);
      

      数组中的第一列已经有一个外键和一个相关的索引。

      第一个选项是先放置一个还没有外键的字段,例如

      $table->unique(["key", 'owner_id', 'promoter_id']);
      

      但这并不总是可能的

      第二个选项——你只需要修改down()函数

      例如,您像这样创建唯一索引

      $table->unique(['owner_id', 'promoter_id']);
      

      owner_id 是现在给您带来麻烦的字段,因为它排在数组的第一个位置。因此,down 函数应如下所示:

      $table->dropForeign(['owner_id']);
      $table->dropUnique(['owner_id', 'promoter_id']);
      $table->foreign('owner_id')->references('id')->on('owners');
      

      第三个选项有点棘手,你的'down'函数看起来像这样

      $table->index('owner_id');
      $table->dropUnique(['owner_id', 'promoter_id']);
      

      它会起作用,但是我不推荐它,因为它不是一个“回滚”

      如果您以索引名称 records_owner_id_foreign 开头 然后你做php artisan migrate 然后php artisan migrate:rollback 然后你会找到你的索引名称records_owner_id_index。不再是同一个索引名了

      因此,您可以在不同的数据库中使用不同的索引名称,您喜欢吗?我没有。

      【讨论】:

      • 正是我想要的,写得真好!
      猜你喜欢
      • 2016-07-06
      • 2020-10-01
      • 1970-01-01
      • 2019-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-02
      相关资源
      最近更新 更多