SQLSTATE[23000]: Integrity constraint violation: 1452 Ne peut pas ajouter ou mettre à jour une ligne enfant: une contrainte de clé étrangère échoue
Je suis en train d'insérer des valeurs dans mes commentaires sur la table et je reçois un message d'erreur. Sa en disant que je ne peux pas ajouter ou mettre à jour ligne enfant et je n'ai aucune idée de ce que cela signifie.
Mon schéma ressemble à quelque chose comme ceci:
--
-- Baza danych: `koxu1996_test`
--
-- --------------------------------------------------------
--
-- Struktura tabeli dla tabeli `user`
--
CREATE TABLE IF NOT EXISTS `user` (
`id` int(8) NOT NULL AUTO_INCREMENT,
`username` varchar(32) COLLATE utf8_bin NOT NULL,
`password` varchar(64) COLLATE utf8_bin NOT NULL,
`password_real` char(32) COLLATE utf8_bin NOT NULL,
`email` varchar(32) COLLATE utf8_bin NOT NULL,
`code` char(8) COLLATE utf8_bin NOT NULL,
`activated` enum('0','1') COLLATE utf8_bin NOT NULL DEFAULT '0',
`activation_key` char(32) COLLATE utf8_bin NOT NULL,
`reset_key` varchar(32) COLLATE utf8_bin NOT NULL,
`name` varchar(32) COLLATE utf8_bin NOT NULL,
`street` varchar(32) COLLATE utf8_bin NOT NULL,
`house_number` varchar(32) COLLATE utf8_bin NOT NULL,
`apartment_number` varchar(32) COLLATE utf8_bin NOT NULL,
`city` varchar(32) COLLATE utf8_bin NOT NULL,
`zip_code` varchar(32) COLLATE utf8_bin NOT NULL,
`phone_number` varchar(16) COLLATE utf8_bin NOT NULL,
`country` int(8) NOT NULL,
`province` int(8) NOT NULL,
`pesel` varchar(32) COLLATE utf8_bin NOT NULL,
`register_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`authorised_time` datetime NOT NULL,
`edit_time` datetime NOT NULL,
`saldo` decimal(9,2) NOT NULL,
`referer_id` int(8) NOT NULL,
`level` int(8) NOT NULL,
PRIMARY KEY (`id`),
KEY `country` (`country`),
KEY `province` (`province`),
KEY `referer_id` (`referer_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=83 ;
et mysql déclaration, je suis en train de faire ressemble à quelque chose comme ceci:
INSERT INTO `user` (`password`, `code`, `activation_key`, `reset_key`, `register_time`, `edit_time`, `saldo`, `referer_id`, `level`) VALUES (:yp0, :yp1, :yp2, :yp3, NOW(), NOW(), :yp4, :yp5, :yp6). Bound with :yp0='fa1269ea0d8c8723b5734305e48f7d46', :yp1='F154', :yp2='adc53c85bb2982e4b719470d3c247973', :yp3='', :yp4='0', :yp5=0, :yp6=1
l'erreur que je reçois ressemble à ceci:
SQLSTATE[23000]: Integrity constraint violation: 1452 Impossible d'ajouter ou de
mise à jour d'une ligne enfant: une contrainte de clé étrangère échoue
(koxu1996_test
.user
, CONTRAINTEuser_ibfk_1
DE CLÉ ÉTRANGÈRE
(country
) RÉFÉRENCEScountry_type
(id
) ON DELETE NO ACTION SUR
MISE À JOUR AUCUNE ACTION)
- Avez-vous regardé tout de la même question/réponses ici, de SORTE avant de poster? Votre message d'erreur indique clairement que le
koxu1996_test.country
est la valeur que vous(ne sont pas) l'insertion n'est pas une valeur valide decountry_type.id
.
Vous devez vous connecter pour publier un commentaire.
- Il tout simplement signifie que la valeur de la colonne de pays sur la table des commentaires que vous insérez n'existe pas sur la table country_type ou vous n'êtes pas l'insertion de la valeur pour le pays sur la table utilisateur.
Gardez à l'esprit que les valeurs de la colonne de pays sur la table des commentaires est dépendante des valeurs de ID sur la table country_type.
Vous avez les clés étrangères entre ce tableau et une autre table et cette nouvelle ligne serait en violation de cette contrainte.
Vous devriez être capable de voir la contrainte si vous exécutez
show create table user
, il se présente commeCONSTRAINT...
et il montre ce que les colonnes de référence quelles tables/colonnes.Dans ce cas
country
référencescountry_type (id)
et vous n'êtes pas en spécifiant la valeur decountry
. Vous avez besoin de mettre une valeur qui existe danscountry_type
.Juste à jeter dans ma propre question dans le cas où il peut aider quelqu'un d'autre, j'ai été copier/coller des entrées dans ma migration des fichiers et des foiré en mettant des guillemets autour d'un entier. Étant donné que la valeur que j'essayais d'entrer était considéré comme une chaîne de caractères dans un champ de type entier qui faisait référence à un autre nombre entier, cette erreur est survenue.
Une autre option pourrait être thath votre clé primaire dans la table source n'EST PAS non signé, donc, j'ai résolu même avec insert (avis
id
int(8) unsigned):Dans mon cas, la valeur était vide de cible colonne de la table tandis que la table de référence de la colonne a il. d'où le jetait cette erreur.
Dans mon cas, les valeurs de référence n'a pas de correspondant sur la table liée. Juste être sûr que les valeurs de la table de référence et les courants de lignes correspondant a des valeurs valides.