nap*_*ias 4 php mysql laravel laravel-5 laravel-5.6
我创建了唯一索引:
$table->unique(['owner_id', 'promoter_id']);
Run Code Online (Sandbox Code Playgroud)
现在我托盘放下它
$table->dropUnique(['owner_id', 'promoter_id']);
Run Code Online (Sandbox Code Playgroud)
一般错误:1553 无法删除索引“connections_owner_id_promoter_id_unique”:需要在外键约束中(SQL:alter table connections drop index connections_owner_id_promoter_id_unique)
另外,我之前尝试删除外键
$table->dropForeign('connections_promoter_id_foreign');
Run Code Online (Sandbox Code Playgroud)
但仍然没有结果
从错误消息来看,您似乎在同一运行中创建了外键和唯一元组,如下所示:
$table->foreignId('owner_id')->constrained('owners');
$table->unique(['owner_id', 'promoter_id']);
Run Code Online (Sandbox Code Playgroud)
来自mysql 文档:
MySQL要求外键列建立索引;如果创建具有外键约束但给定列上没有索引的表,则会创建索引。
现在,当您创建一个元组索引时,owner_id已经有了一个索引(因为它是元组的第一个,注意promoter_id没有索引),并且 MySQL 不需要创建一个foreign_key索引。但是,如果您现在删除唯一键约束,您将拥有一个没有索引的外键。这是不允许的,因此您会收到错误消息。
无需删除外键。只需在删除唯一索引之前在字段上添加普通索引即可。像这样:
$table->index('owner_id');
$table->dropUnique(['owner_id', 'promoter_id']);
Run Code Online (Sandbox Code Playgroud)
就是这样。外键错误不会出现,因为您已对其建立索引。
从Laravel docs on Indexes 中,您可以创建具有指定名称的唯一索引:
因此,为了避免调试 laravel 如何为索引构造名称,您可以在添加索引时为其分配一个名称,例如:
$table->unique(['owner_id', 'promoter_id'], 'owner_promoter_index');
Run Code Online (Sandbox Code Playgroud)
然后当你放下它时,你使用相同的名字:
$table->dropUnique('owner_promoter_index');
Run Code Online (Sandbox Code Playgroud)