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.