tabela 1
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| UserID | int(11) | NO | PRI | NULL | auto_increment |
| Password | varchar(20) | NO | | | |
| Username | varchar(25) | NO | | | |
| Email | varchar(60) | NO | | | |
+----------+-------------+------+-----+---------+----------------+
mesa 2
+------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------------+--------------+------+-----+---------+----------------+
| UserID | int(11) | NO | MUL | | |
| PostID | int(11) | NO | PRI | NULL | auto_increment |
| Title | varchar(50) | NO | | | |
| Summary | varchar(500) | NO | | | |
+------------------+--------------+------+-----+---------+----------------+
Erro:
com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException:
Cannot add or update a child row: a foreign key constraint fails
(`myapp/table2`, CONSTRAINT `table2_ibfk_1` FOREIGN KEY (`UserID`)
REFERENCES `table1` (`UserID`))
O que eu fiz errado? Li http://www.w3schools.com/Sql/sql_foreignkey.asp e não vejo o que há de errado.
table2.UserID
que não existetable1.UserID
.Respostas:
Você está recebendo este erro porque está tentando adicionar / atualizar uma linha
table2
que não possui um valor válido para oUserID
campo com base nos valores atualmente armazenadostable1
. Se você postar mais algum código, eu posso ajudá-lo a diagnosticar a causa específica.fonte
Isso significa que você está tentando inserir
table2
umUserID
valor que não existetable1
.fonte
Um hack simples pode ser desativar as verificações de chave estrangeira antes de executar qualquer operação na tabela. Basta consultar
Isso desativará a correspondência de chave estrangeira em outras tabelas. Depois de terminar a tabela, ative-a novamente
Isso funciona para mim muitas vezes.
fonte
Eu descobri outro caso estranho: se você acidentalmente criar uma chave estrangeira de uma tabela InnoDB para uma tabela MyISAM, o MySQL lançará esse erro no momento da inserção, mesmo que os dados sejam válidos.
Veja http://nick.zoic.org/art/mysql-foreign-key-error/
fonte
Você está recebendo esse erro porque há algum valor int
table2.UserID
que não existetable1.UserID
(acho que você definiu otable2.UserID
valor manualmente antes de criar essa chave estrangeira).Um exemplo para esta cena:
table1.UserID
obter valores 1,2,3 etable2.UserID
obter valores 4 (adicionar pelo manual). Então, quando você faz uma chave estrangeira, eles não conseguem encontrarUserID = 4
a partirtable1
e o erro será ocurse.Para corrigir este erro, basta remover
UserID = 4
a partir detable2
ou você pode esvaziar ambos e, em seguida, criar a chave estrangeira e.Boa sorte!
fonte
Demorei um pouco para descobrir. Simplificando, a tabela que referencia a outra tabela já possui dados e um ou mais de seus valores não existe na tabela pai.
por exemplo, a Tabela2 possui os seguintes dados:
Tabela 1
Se você tentar ALTERAR a tabela2 e adicionar uma chave estrangeira, a consulta falhará porque o UserID = 5 não existe na Tabela1.
fonte
Se você inseriu uma linha na tabela 1 antes de criar a chave estrangeira na tabela 2, receberá um erro de restrição de chave estrangeira, porque o valor do incremento automático é 2 na tabela 1 e 1 na tabela 2. Para resolver isso, é necessário trunque a tabela 1 e defina o valor de incremento automático de volta para 1. Em seguida, você pode adicionar a tabela 2.
fonte
Verifique se você configurou o mecanismo de banco de dados como InnoDB, porque no MySQL a chave estrangeira e a transação não são suportadas
fonte
Apenas uma pequena correção: torne o JoinColumn 'nullable = true' na Tabela1 e o campo 'UserID' 'insertable = false' e 'nullable = true' na Tabela2.
Na Entidade Tabela1:
Na Entidade Tabela2:
fonte
Acabei de ter o mesmo problema, a solução é fácil.
Você está tentando adicionar um ID na tabela filho que não existe na tabela pai.
verifique bem, porque o InnoDB possui o bug que às vezes aumenta a coluna auto_increment sem adicionar valores, por exemplo,
INSERT ... ON DUPLICATE KEY
fonte
Eu tive uma questão semelhante. Você está tentando aplicar chave estrangeira em uma tabela que possui conteúdo e a coluna não é anulável. Você tem duas opções.
fonte
Verifique se o valor que você está inserindo na chave estrangeira existe na tabela pai. Isso me ajudou. Por exemplo, se você inserir
user_id = 2
emtable.2
, mastable.1
não tiver umuser_id = 2
, a restrição gerará um erro. O meu era o código de erro # 1452 para ser exato. Espero que isso ajude outras pessoas com o mesmo problema!fonte
Eu tive o mesmo problema, e o motivo era que eu tinha uma linha na primeira tabela antes de adicionar a chave estrangeira.
fonte
Também enfrentei o mesmo problema e o problema era que o valor das entradas da tabela pai não coincide com o valor da tabela de chave estrangeira. Então, tente limpar todas as linhas.
fonte
Caso as soluções fornecidas por outros não funcionassem. Tente verificar os mecanismos de banco de dados das tabelas pai e filho. No meu caso, eu tinha o mecanismo das tabelas pai definido como "MyISAM", alterando-o para o InnoDB corrigido.
Espero que isso ajude outras pessoas que estão presas como eu.
fonte
Você não deve colocar um campo ondelete em uma cascata no banco de dados.
Portanto, defina o campo onDelete como RESTRICT
Boa sorte ♥
fonte
Outro caso estranho que me deu esse erro. Eu referenciei erroneamente minhas chaves estrangeiras à chave primária de identificação. Isso foi causado por comandos incorretos de alteração da tabela. Descobri isso consultando a tabela INFORMATION_SCHEMA (consulte esta resposta do stackoverflow)
A tabela estava tão confusa que não pôde ser corrigida por nenhum comando ALTER TABLE . Eu finalmente larguei a mesa e a reconstruí. Isso se livrou do erro de integridade.
fonte
Talvez enquanto você adicionou a
userID
coluna, existem dados para essa determinada tabela que ela está estabelecida e, portanto, terá um valor padrão0
, tente adicionar a coluna sem oNOT NULL
fonte
Também recebi este erro: "Não é possível adicionar ou atualizar uma linha filho: uma restrição de chave estrangeira falha". Recebi o erro ao adicionar uma nova linha à tabela pai
O problema era que a restrição de chave estrangeira havia sido definida na tabela pai em vez da tabela filho.
fonte
Se você usar o índice mysql ou a relação entre tabelas, primeiro exclua as colunas (por exemplo: city_id) e crie novas colunas com o mesmo nome (por exemplo: city_id). Em seguida, tente novamente ...
fonte
Existe algum dado existente que a tabela contenha? Nesse caso, tente limpar todos os dados da tabela que você deseja adicionar uma chave estrangeira. Em seguida, execute o código (adicione uma chave estrangeira) novamente.
Eu encontrei esse problema tantas vezes. Essa limpeza de todos os dados da tabela funciona quando você deseja adicionar uma chave estrangeira a uma tabela existente.
Espero que isso funcione :)
fonte
Exclua índices do campo UserID da tabela2. Seus ternos para mim
fonte
Esse problema pode ocorrer devido ao seguinte motivo:
Se você estiver fazendo isso no Spring mvc, precisará descrever explicitamente o tipo de id, porque às vezes o mysql falha em reconhecer o tipo de id. para que você defina explicitamente como nas duas tabelas da sua classe de entidade
@GeneratedValue (strategy = GenerationType.IDENTITY)
fonte