É possível desativar temporariamente as restrições no MySQL?
Eu tenho dois modelos de Django, cada um com uma chave estrangeira para o outro. A exclusão de instâncias de um modelo retorna um erro devido à restrição ForeignKey:
cursor.execute("DELETE FROM myapp_item WHERE n = %s", n)
transaction.commit_unless_managed() #a foreign key constraint fails here
cursor.execute("DELETE FROM myapp_style WHERE n = %s", n)
transaction.commit_unless_managed()
É possível desativar temporariamente as restrições e excluir de qualquer maneira?
mysql
sql
django
django-models
jul
fonte
fonte
ON DELETE SET NULL
? Isso faria uma coisa semelhante e você não precisaria ativar e desativar a verificação de chaves.Respostas:
Experimente
DISABLE KEYS
outenha certeza de
depois de.
fonte
disable keys
para o InnodbPara desativar globalmente a restrição de chave estrangeira, faça o seguinte:
e lembre-se de devolvê-lo quando terminar
AVISO: você deve fazer isso apenas quando estiver fazendo manutenção no modo de usuário único. Como pode resultar em inconsistência dos dados. Por exemplo, será muito útil quando você estiver carregando uma grande quantidade de dados usando uma saída mysqldump.
fonte
SET FOREIGN_KEY_CHECKS
altera o valor da conexão atual , enquantoSET GLOBAL ..
altera o valor de todas as conexões , incluindo conexões futuras. Se você apenas fizer issoSET FOREIGN..
em uma janela, tente aplicar a instrução em uma janela diferente (em uma conexão diferente), o valor não foi alterado lá. ComGLOBAL
, a mesma variável tem o mesmo valor para ambas as conexões.ERROR 1228 (HY000): Variable 'foreign_key_checks' is a SESSION variable and can't be used with SET GLOBAL
Normalmente, desabilito as restrições de chave estrangeira apenas quando quero truncar uma tabela e, como continuo voltando a esta resposta, isso é para mim do futuro:
fonte
Em vez de desativar sua restrição, modifique-a permanentemente para ON DELETE SET NULL. Isso fará uma coisa semelhante e você não precisaria ativar e desativar a verificação de chaves. Igual a:
Leia isto ( http://dev.mysql.com/doc/refman/5.5/en/alter-table.html ) e este ( http://dev.mysql.com/doc/refman/5.5/en /create-table-foreign-keys.html ).
fonte
FOREIGN_KEY_CHECKS
como 0 e colocá-lo de volta assim que o trabalho sujo for concluído. Além disso, pode travar para escrever suas tabelas.Para desativar a restrição de chave estrangeira globalmente:
e para restrição de chave estrangeira ativa
fonte
Uma solução muito simples com o phpmyadmin:
fonte
SET FOREIGN_KEY_CHECKS=0; ..... SET FOREIGN_KEY_CHECKS=1;
não funcionou para mim no PHPMyAdmin porque esqueci de desmarcar a caixa de seleção 'Ativar verificações de chave estrangeira'. No PHPMyAdmin, você pode pular esses comandos SET e apenas desmarcar a caixa de seleção.Para mim simplesmente
SET FOREIGN_KEY_CHECKS=0;
não foi suficiente. Eu ainda estava tendo umcom.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException
.Eu tive que adicionar
ALTER TABLE myTable DISABLE KEYS;
.Assim:
fonte
Se o campo-chave for anulável, você também poderá definir o valor como nulo antes de tentar excluí-lo:
fonte
No phpMyAdmin, você pode selecionar várias linhas e clicar na ação excluir. Você entrará em uma tela que lista as consultas de exclusão, pode desmarcar a verificação de chave estrangeira e clicar em Sim para executá-las.
Isso permitirá que você exclua linhas, mesmo se houver uma restrição de restrição ON DELETE.
fonte
Não é uma boa ideia definir uma restrição de chave estrangeira como 0, porque se você fizer isso, seu banco de dados não garantirá que não esteja violando a integridade referencial. Isso pode levar a dados imprecisos, enganosos ou incompletos.
Você cria uma chave estrangeira por um motivo: porque todos os valores na coluna filho devem ser iguais a um valor na coluna pai. Se não houver restrições de chave estrangeira, uma linha filha pode ter um valor que não esteja na linha pai, o que levaria a dados imprecisos.
Por exemplo, digamos que você tenha um site para os alunos fazerem login e todos os alunos devem se registrar em uma conta como usuário. Você tem uma tabela para os IDs do usuário, com o ID do usuário como chave primária; e outra tabela para contas de alunos, com o ID do aluno como uma coluna. Como todo aluno deve ter um ID de usuário, faria sentido transformar o ID do aluno da tabela de contas do aluno em uma chave estrangeira que faça referência ao ID do usuário da chave primária na tabela de IDs do usuário. Se não houver verificação de chave estrangeira, um aluno pode acabar tendo um ID de estudante e nenhum ID de usuário, o que significa que um aluno pode obter uma conta sem ser um usuário, o que está errado.
Imagine se isso acontecer com uma grande quantidade de dados. É por isso que você precisa da verificação de chave estrangeira.
É melhor descobrir o que está causando o erro. Provavelmente, você está tentando excluir de uma linha pai sem excluir de uma linha filho. Tente excluir da linha filho antes de excluir da linha pai.
fonte