Acho que você não entendeu o que
ON DELETE NO ACTION
meios. Ele não significa suprimir a restrição de chave estrangeira. Quando você exclui um registro referenciado por uma chave estrangeira, o InnoDB tem a capacidade de executar uma ação automática para corrigir a situação:
- pode
CASCADE
, ou seja, excluir o registro de referência. (Isso faria sentido para algo comouser_address.user_id
. Se você excluir permanentemente um usuário, provavelmente desejará excluir também todos os endereços do usuário. - pode
SET NULL
, ou seja, limpe a chave de referência. (Isso pode fazer sentido para algo comofile.last_modified_by
. Se você excluir um usuário definitivamente, talvez queira que o último modificado por do arquivo se torne simplesmente "desconhecido".)
Se você especificar
NO ACTION
, você está dizendo ao InnoDB que não deseja que ele execute nenhuma dessas ações. Portanto, o InnoDB não pode corrigir a situação para você; tudo o que pode fazer é rejeitar o DELETE
e retornar um erro. Como resultado,
ON DELETE NO ACTION
é na verdade o mesmo que ON DELETE RESTRICT
(o padrão). (Nota:em alguns DBMSes, e no SQL padrão,
ON DELETE NO ACTION
é um pouco diferente de ON DELETE RESTRICT
:nesses, ON DELETE NO ACTION
significa "aceitar o DELETE
dentro da transação atual, mas rejeite a transação inteira se eu tentar confirmá-la antes de corrigir o problema". Mas o InnoDB não suporta verificações adiadas, então ele trata ON DELETE NO ACTION
exatamente igual a ON DELETE RESTRICT
, e sempre rejeita o DELETE
imediatamente .) Consulte §§14.2.2.5 "CHAVE ESTRANGEIRA Restrições" e 13.1.17.2 "Usando restrições FOREIGN KEY " no Manual de Referência do MySQL 5.6.