Por que não faz um TRUNCATE no mygroup
trabalho? Mesmo que ON DELETE CASCADE SET
eu recebo:
ERRO 1701 (42000): Não é possível truncar uma tabela referenciada em uma restrição de chave estrangeira (
mytest
.instance
, CONSTRAINTinstance_ibfk_1
FOREIGN KEY (GroupID
) REFERENCESmytest
.mygroup
(ID
))
drop database mytest;
create database mytest;
use mytest;
CREATE TABLE mygroup (
ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY
) ENGINE=InnoDB;
CREATE TABLE instance (
ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
GroupID INT NOT NULL,
DateTime DATETIME DEFAULT NULL,
FOREIGN KEY (GroupID) REFERENCES mygroup(ID) ON DELETE CASCADE,
UNIQUE(GroupID)
) ENGINE=InnoDB;
mysql
foreign-keys
constraints
truncate
dml
user391986
fonte
fonte
Sim você pode:
Com essas instruções, você corre o risco de inserir linhas em suas tabelas que não aderem às
FOREIGN KEY
restrições.fonte
;
). Isso ocorre porque cada chamada SQL web fresco irá repor oFOREIGN_KEY_CHECKS
para 1.Eu simplesmente faria isso com:
fonte
DELETE
desempenho é mais lento queTRUNCATE
. Mas como essa ação geralmente é executada apenas raramente, isso não importa.DELETE
pode ser absolutamente brutal se você tiver muitas linhas - uma vez que atinge os logs, enquantoTRUNCATE
apenas retira os dados. Realmente depende do caso de uso.error 1175: You are using safe update mode,...
cláusula change delete paraDELETE FROM mydb.mytable where id != 0
torná-la perfeita.você pode fazer
fonte
mytable
Conforme documentação do mysql , TRUNCATE não pode ser usado em tabelas com relacionamentos de chave estrangeira. Não há AFAIK alternativo completo.
A eliminação do contraint ainda não chama ON DELETE e ON UPDATE. A única solução em que posso pensar em ATM é:
Parece que TRUNCATE no MySQL ainda não é um recurso completo (também não invoca gatilhos).Ver comentáriofonte
TRUNCATE
incompleto - truncado não deve chamar gatilhos, etc. Se assim fosse, seria o mesmo queDELETE
! É independente de linha, portanto, é incapaz de executar operações relacionadas à linha (como invocar gatilhos ou examinar chaves estrangeiras). Funciona da mesma maneira no Oracle e no Sql Server .Fácil se você estiver usando o phpMyAdmin.
Basta desmarcar a
Enable foreign key checks
opção naSQL
guia e executarTRUNCATE <TABLE_NAME>
fonte
Enquanto essa pergunta foi feita, eu não sabia, mas agora, se você usa o phpMyAdmin, pode simplesmente abrir o banco de dados e selecionar a (s) tabela (s) que deseja truncar.
Empty
opção sob o cabeçalhoDelete data or table
.Enable foreign key checks
. Basta desmarcar e pressionar oYes
botão e as tabelas selecionadas serão truncadas.Talvez ele execute internamente a consulta sugerida na resposta do usuário447951 , mas é muito conveniente usar a partir da interface do phpMyAdmin.
fonte
Testado no banco de dados MYSQL
Solução 1:
Solução 2:
Isso funciona para mim. Espero que isso ajude você também. Obrigado por fazer esta pergunta.
fonte
A resposta é realmente a fornecida por zerkms , como indicado na Opção 1 :
A parte complicada é remover restrições , por isso, quero lhe dizer como, caso alguém precise saber como fazer isso:
Execute a
SHOW CREATE TABLE <Table Name>
consulta para ver qual é o nome da sua FOREIGN KEY (quadro vermelho na imagem abaixo):Corra
ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name>
. Isso removerá a restrição de chave estrangeira.Solte o índice associado (na página de estrutura da tabela) e pronto.
recriar chaves estrangeiras:
fonte
Basta usar CASCADE
Mas esteja pronto para exclusões em cascata)
fonte
Se o mecanismo de banco de dados para tabelas for diferente, você receberá esse erro, então altere-os para InnoDB
fonte
Obter o antigo estado de verificação de chave estrangeira e o modo sql é a melhor maneira de truncar / soltar a tabela como o Mysql Workbench faz ao sincronizar o modelo com o banco de dados.
fonte