Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Por que usar chaves estrangeiras sem ação na exclusão ou atualização


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 como user_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 como file.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.