Estou tendo um problema estranho. Estou tentando adicionar uma chave estrangeira a uma tabela que faça referência a outra, mas está falhando por algum motivo. Com meu conhecimento limitado do MySQL, a única coisa que poderia ser suspeita é que existe uma chave estrangeira em uma tabela diferente que faz referência à que estou tentando referenciar.
Eu fiz uma SHOW CREATE TABLE
consulta nas duas tabelas, sourcecodes_tags
é a tabela com a chave estrangeira, sourcecodes
é a tabela referenciada.
CREATE TABLE `sourcecodes` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) unsigned NOT NULL,
`language_id` int(11) unsigned NOT NULL,
`category_id` int(11) unsigned NOT NULL,
`title` varchar(40) CHARACTER SET utf8 NOT NULL,
`description` text CHARACTER SET utf8 NOT NULL,
`views` int(11) unsigned NOT NULL,
`downloads` int(11) unsigned NOT NULL,
`time_posted` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
KEY `language_id` (`language_id`),
KEY `category_id` (`category_id`),
CONSTRAINT `sourcecodes_ibfk_3` FOREIGN KEY (`language_id`) REFERENCES `languages` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `sourcecodes_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `sourcecodes_ibfk_2` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
CREATE TABLE `sourcecodes_tags` (
`sourcecode_id` int(11) unsigned NOT NULL,
`tag_id` int(11) unsigned NOT NULL,
KEY `sourcecode_id` (`sourcecode_id`),
KEY `tag_id` (`tag_id`),
CONSTRAINT `sourcecodes_tags_ibfk_1` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1
Este é o código que gera o erro:
ALTER TABLE sourcecodes_tags ADD FOREIGN KEY (sourcecode_id) REFERENCES sourcecodes (id) ON DELETE CASCADE ON UPDATE CASCADE
Respostas:
Provavelmente, sua
sourcecodes_tags
tabela contémsourcecode_id
valores que não existem mais em suasourcecodes
tabela. Você tem que se livrar deles primeiro.Aqui está uma consulta que pode encontrar esses IDs:
fonte
UPDATE sourcecodes_tags SET sourcecode_id = NULL WHERE sourcecode_id NOT IN (SELECT id FROM sourcecodes)
deve ajudar a se livrar desses IDs. Ou, senull
não for permitido entrarsourcecode_id
, remova essas linhas ou adicione esses valores ausentes àsourcecodes
tabela.SELECT Tchild.id FROM Tchild INNER JOIN Tmain ON Tmain.id = Tchild.fk_id WHERE Tmain.id IS NULL
, não retorna nada, então o problema está em outro lugar !?UPDATE `homestead`.`automations` SET `deleted_at`=NULL WHERE deleted_at IS NOT NULL;
, o que não envolvia uma chave estrangeira, então fiquei confuso. Mas o fato de minha tabela de contatos estar ausente de alguns registros aos quais a tabela de automações se referiu fez com que este fosse "Código de erro: 1452. Não é possível adicionar ou atualizar uma linha filho: uma restrição de chave estrangeira falha".Eu tive o mesmo problema com meu banco de dados MySQL, mas finalmente consegui uma solução que funcionou para mim.
Como na minha tabela tudo estava bem do ponto de vista do mysql (ambas as tabelas devem usar o mecanismo InnoDB e o tipo de dados de cada coluna deve ser do mesmo tipo que participa da restrição de chave estrangeira).
A única coisa que fiz foi desabilitar a verificação da chave estrangeira e, posteriormente, habilitá-la após executar a operação da chave estrangeira.
Etapas que tomei:
fonte
Use
NOT IN
para descobrir onde as restrições estão restringindo :então, mais especificamente:
EDIT:
IN
eNOT IN
sabe-se que osJOIN
operadores são muito mais rápidos que os operadores, bem como muito mais fáceis de construir e repetir.fonte
Trunque as tabelas e tente adicionar a restrição FK .
Eu sei que esta solução é um pouco estranha, mas funciona 100%. Mas concordo que essa não é uma solução ideal para lidar com o problema, mas espero que ajude.
fonte
Para mim, esse problema era um pouco diferente e super fácil de verificar e resolver.
Você deve garantir que ambas as suas tabelas sejam o InnoDB. Se uma das tabelas, ou seja, a tabela de referência for um MyISAM, a restrição falhará.
fonte
Isso também acontece ao definir uma chave estrangeira como parent.id como child.column se o child.column já tiver um valor 0 e nenhum valor parent.id for 0
Você precisaria garantir que cada child.column seja NULL ou tenha um valor que exista em parent.id
E agora que li a declaração que nos escreveu, é isso que ele está validando.
fonte
Eu tive o mesmo problema hoje. Eu testei para quatro coisas, algumas delas já mencionadas aqui:
Há algum valor na coluna filho que não exista na coluna pai (além de NULL, se a coluna filha for anulável)
As colunas filho e pai têm o mesmo tipo de dados?
Existe um índice na coluna pai que você está referenciando? O MySQL parece exigir isso por razões de desempenho ( http://dev.mysql.com/doc/refman/5.5/en/create-table-foreign-keys.html )
E este resolveu para mim: as duas tabelas têm agrupamento idêntico?
Eu tinha uma mesa em UTF-8 e a outra em iso-something. Isso não funcionou. Após alterar a tabela iso para agrupamento UTF-8, as restrições podem ser adicionadas sem problemas. No meu caso, o phpMyAdmin nem mostrou a tabela filho em iso-codificação no menu suspenso para criar a restrição de chave estrangeira.
fonte
Parece que existe algum valor inválido para a linha de coluna 0 que não é uma chave estrangeira válida, portanto o MySQL não pode definir uma restrição de chave estrangeira para ela.
Você pode seguir estas etapas:
Solte a coluna para a qual você tentou definir a restrição FK.
Adicione-o novamente e defina seu valor padrão como NULL.
Tente definir uma restrição de chave estrangeira para ele novamente.
fonte
Eu tinha o mesmo problema, verifiquei as linhas das minhas tabelas e descobri que havia alguma incompatibilidade com o valor dos campos que eu queria definir uma chave estrangeira. Corrigi esses valores, tentei novamente e o problema foi resolvido.
fonte
Acabo excluindo todos os dados da minha tabela e execute alter novamente. Funciona. Não é o mais brilhante, mas economiza muito tempo, especialmente seu aplicativo ainda está em estágio de desenvolvimento sem dados de clientes.
fonte
tente isso
fonte
Eu tive exatamente esse mesmo problema em três momentos diferentes. Em cada caso, foi porque um (ou mais) dos meus registros não estava em conformidade com a nova chave estrangeira. Convém atualizar seus registros existentes para seguir as restrições de sintaxe da chave estrangeira antes de tentar adicionar a própria chave. O exemplo a seguir geralmente deve isolar os registros do problema:
repita
AND (candidate key) <> (next proposed foreign key value)
na sua consulta para cada valor na chave estrangeira.Se você possui muitos registros, isso pode ser difícil, mas se sua tabela for razoavelmente pequena, não deve demorar muito. Não sou super incrível na sintaxe SQL, mas isso sempre isolou o problema para mim.
fonte
Esvazie os dados de ambas as tabelas e execute o comando Vai funcionar.
fonte
Eu estava recebendo esse erro ao usar o Laravel e eloqüentemente, tentar criar um link de chave estrangeira causaria um 1452. O problema era a falta de dados na tabela vinculada.
Veja aqui um exemplo: http://mstd.eu/index.php/2016/12/02/laravel-eloquent-integrity-constraint-violation-1452-foreign-key-constraint/
fonte
Eu estava preparando essas soluções e este exemplo pode ajudar.
Meu banco de dados possui duas tabelas (email e credit_card) com chaves primárias para seus IDs. Outra tabela (cliente) refere-se aos IDs dessa tabela como chaves estrangeiras. Eu tenho um motivo para separar o email dos dados do cliente.
Primeiro insiro os dados da linha para as tabelas referenciadas (email, credit_card) e, em seguida, você obtém o ID de cada um, esses IDs são necessários na terceira tabela (cliente).
Se você não inserir primeiro as linhas nas tabelas referenciadas, o MySQL não poderá fazer as correspondências quando você inserir uma nova linha na terceira tabela que faça referência às chaves estrangeiras.
Se você primeiro inserir as linhas referenciadas nas tabelas referenciadas, a linha que se refere a chaves estrangeiras, nenhum erro ocorrerá.
Espero que isto ajude.
fonte
Verifique se o valor está na outra tabela, caso contrário você receberá esse erro na coluna correspondente atribuída.
Portanto, se a coluna atribuída estiver atribuída a um ID de linha de outra tabela, verifique se há uma linha na tabela, caso contrário, esse erro será exibido.
fonte
você pode tentar este exemplo
Nota: se você estiver usando o phpmyadmin, desmarque a opção Ativar verificações de chave estrangeira
como exemplo
espero que esta solução resolva seu problema :)
fonte
Você só precisa responder uma pergunta:
Sua tabela já está armazenando dados? (Especialmente a tabela inclui chave estrangeira.)
Se a resposta for afirmativa, a única coisa que você precisa fazer é excluir todos os registros, e poderá adicionar qualquer chave estrangeira à sua tabela.
O motivo pelo qual você não pode adicionar uma chave estrangeira após a entrada de dados é devido à inconsistência da tabela. Como você lida com uma nova chave estrangeira nos dados anteriores preenchidos na tabela?
Se a resposta for não, siga as outras instruções.
fonte
deve ajudar a se livrar desses IDs. Ou, se
null
não for permitido entrarsourcecode_id
, remova essas linhas ou adicione esses valores ausentes àsourcecodes
tabela.fonte
Eu tive o mesmo problema e encontrei a solução, colocando em
NULL
vez daNOT NULL
coluna de chave estrangeira. Aqui está uma consulta:O MySQL executou esta consulta!
fonte
No meu caso, criei uma nova tabela com a mesma estrutura, criei os relacionamentos com as outras tabelas, extraí os dados no CSV da tabela antiga com o problema, depois importei o CSV para a nova tabela e desabilitei a verificação de chave estrangeira e interrupção de importação desativada, todos os meus dados são inseridos na nova tabela que não apresenta problemas com êxito e, em seguida, excluídos da tabela antiga.
Funcionou para mim.
fonte