Ao fazer:
DELETE FROM `jobs` WHERE `job_id` =1 LIMIT 1
Erros:
#1451 - Cannot delete or update a parent row: a foreign key constraint fails
(paymesomething.advertisers, CONSTRAINT advertisers_ibfk_1 FOREIGN KEY
(advertiser_id) REFERENCES jobs (advertiser_id))
Aqui estão as minhas tabelas:
CREATE TABLE IF NOT EXISTS `advertisers` (
`advertiser_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`password` char(32) NOT NULL,
`email` varchar(128) NOT NULL,
`address` varchar(255) NOT NULL,
`phone` varchar(255) NOT NULL,
`fax` varchar(255) NOT NULL,
`session_token` char(30) NOT NULL,
PRIMARY KEY (`advertiser_id`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
INSERT INTO `advertisers` (`advertiser_id`, `name`, `password`, `email`, `address`, `phone`, `fax`, `session_token`) VALUES
(1, 'TEST COMPANY', '', '', '', '', '', '');
CREATE TABLE IF NOT EXISTS `jobs` (
`job_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`advertiser_id` int(11) unsigned NOT NULL,
`name` varchar(255) NOT NULL,
`shortdesc` varchar(255) NOT NULL,
`longdesc` text NOT NULL,
`address` varchar(255) NOT NULL,
`time_added` int(11) NOT NULL,
`active` tinyint(1) NOT NULL,
`moderated` tinyint(1) NOT NULL,
PRIMARY KEY (`job_id`),
KEY `advertiser_id` (`advertiser_id`,`active`,`moderated`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
INSERT INTO `jobs` (`job_id`, `advertiser_id`, `name`, `shortdesc`, `longdesc`, `address`, `active`, `moderated`) VALUES
(1, 1, 'TEST', 'TESTTEST', 'TESTTESTES', '', 0, 0);
ALTER TABLE `advertisers`
ADD CONSTRAINT `advertisers_ibfk_1` FOREIGN KEY (`advertiser_id`) REFERENCES `jobs` (`advertiser_id`);
A maneira mais simples seria desativar a verificação de chave estrangeira; faça as alterações e reative a verificação de chave estrangeira.
fonte
REPLACE INTO tab_with_constraint ...
No seu design atual (possivelmente defeituoso), você deve excluir a linha da tabela de anunciantes antes de excluir a linha na tabela de tarefas a que se refere.
Como alternativa, você pode configurar sua chave estrangeira para que uma exclusão na tabela pai faça com que as linhas nas tabelas filho sejam excluídas automaticamente. Isso é chamado de exclusão em cascata. Parece algo assim:
Dito isto, como outros já apontaram, sua chave estrangeira parece que deve ser inversa, pois a tabela de anunciantes realmente contém a chave primária e a tabela de trabalhos contém a chave estrangeira. Eu reescreveria assim:
E a exclusão em cascata não será necessária.
fonte
Se você deseja soltar uma tabela, execute a seguinte consulta em uma única etapa
SET FOREIGN_KEY_CHECKS = 0; DROP TABLE nome_tabela;
fonte
Tentei a solução mencionada por @Alino Manzi, mas não funcionou para mim nas tabelas relacionadas ao WordPress usando o wpdb.
então eu modifiquei o código como abaixo e funcionou
fonte
Eu acho que sua chave estrangeira está ao contrário. Experimentar:
fonte
Se houver mais de um trabalho com o mesmo advertiser_id, sua chave estrangeira deverá ser:
Caso contrário (se for o contrário, no seu caso), se você desejar que as linhas do anunciante sejam excluídas automaticamente se a linha do trabalho for excluída, adicione a opção 'ON DELETE CASCADE' ao final da sua chave estrangeira:
Confira restrições de chave estrangeira
fonte
Você precisa excluí-lo por ordem. Há dependência nas tabelas
fonte
Quando você cria um banco de dados ou cria tabelas
Você deve adicionar essa linha no script superior para criar banco de dados ou tabela
Agora você deseja excluir registros da tabela? então você escreve como
Boa sorte!
fonte
Que tal essa alternativa que estou usando: permita que a chave estrangeira seja NULL e escolha ON DELETE SET NULL .
Pessoalmente, prefiro usar " ON UPDATE CASCADE " e " ON DELETE SET NULL " para evitar complicações desnecessárias, mas na sua configuração você pode querer uma abordagem diferente. Além disso, valores nulos de chave estrangeira podem levar a complicações, pois você não saberá exatamente o que aconteceu lá. Portanto, essa alteração deve estar em estreita relação com o funcionamento do código do aplicativo.
Espero que isto ajude.
fonte
Eu tive esse problema na migração laravel também,
a ordem das tabelas suspensas no método down () importa
pode não funcionar, mas se você alterar a ordem, ela funcionará.
fonte
se você precisar dar suporte ao cliente o mais rápido possível e não tiver acesso a
para que a integridade dos dados possa ser desativada:
1) excluir chave estrangeira
2) ative sua operação de exclusão através de sql ou api
3) adicione a chave estrangeira de volta ao esquema
no entanto, é uma correção, por sua conta e risco, porque a principal falha dessa abordagem é que é necessário posteriormente para manter a integridade dos dados manualmente.
fonte
Você pode criar um gatilho para excluir as linhas referenciadas antes de excluir o trabalho.
fonte
O principal problema com esse erro
Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails
é que ele não informa qual tabela contém a falha do FK; portanto, é difícil resolver o conflito.Se você usa MySQL ou similar, descobri que você pode criar um diagrama de ER para seu banco de dados, então você pode revisar e remover com segurança os conflitos que desencadeiam o erro.
connection
database
etables
que precisa examinarfonte
Basicamente, a razão por trás desse tipo de erro é eventualmente que você está tentando excluir um par que possui chave primária (tabela raiz) e essa chave primária é usada na tabela filha como chave estrangeira. Nesse cenário, para excluir os dados da tabela pai, é necessário remover os dados da tabela filha (na qual a chave estrangeira é usada). obrigado
fonte
Isso aconteceu comigo também e, devido a uma dependência e referência de outras tabelas, não foi possível remover a entrada. O que fiz foi adicionado uma coluna de exclusão (do tipo booleano) à tabela. O valor nesse campo mostrou se o item está marcado para exclusão ou não. Se marcado para exclusão, não busque / use; caso contrário, use-o.
fonte
Talvez você deva tentar ON DELETE CASCADE
fonte