web-dev-qa-db-fra.com

SQLSTATE [23000]: Violation de contrainte d'intégrité: 1452 Impossible d'ajouter ou de mettre à jour une ligne enfant: une contrainte de clé étrangère échoue

J'essaie d'insérer des valeurs dans ma table de commentaires et j'obtiens une erreur. C'est en disant que je ne peux pas ajouter ou mettre à jour une ligne enfant et que je n'ai aucune idée de ce que cela signifie . Mon schéma ressemble à 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 la déclaration mysql que j'essaie de faire ressemble à 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]: Violation de contrainte d'intégrité: 1452 Impossible d'ajouter ou mettre à jour une ligne enfant: échec d'une contrainte de clé étrangère (koxu1996_test.user, CONSTRAINT user_ibfk_1 TOUCHE ÉTRANGÈRE (country) RÉFÉRENCES country_type (id) ON SUPPRIMER AUCUNE ACTION LE UPDATE NO ACTUALISATION

9
andrzej1_1

Cela signifie simplement que la valeur de la colonne pays dans les commentaires de la table que vous insérez n'existe pas dans la table type_de_ pays ou que vous n'insérez pas de valeur pour le pays dans la table utilisateur . N'oubliez pas que les valeurs de la colonne country country sur les commentaires de la table dépendent des valeurs de l'ID de la table country_type .

21
Tsimtsum

Vous avez des clés étrangères entre cette table et une autre table et cette nouvelle ligne violerait cette contrainte.

Si vous exécutez show create table user, vous devriez pouvoir voir la contrainte. Elle apparaît sous la forme CONSTRAINT... et indique quelles colonnes font référence à quelles tables/colonnes.

Dans ce cas, country fait référence à country_type (id) et vous ne spécifiez pas la valeur de country. Vous devez mettre une valeur qui existe dans country_type.

4
Andreas Wederbrand

Juste pour ajouter mon propre problème au cas où cela pourrait aider quelqu'un d'autre, je copiais/collaisais des entrées dans mes fichiers de migration et je me suis trompé en mettant des guillemets autour d'un entier. Puisque la valeur que j'essayais d'entrer était considérée comme une chaîne allant dans un champ entier qui référençait un autre entier, cette erreur est survenue.

1
Ben

Dans mon cas, les valeurs de référence ne correspondent pas sur la table associée. Assurez-vous simplement que les valeurs existent dans la table de référence et que les lignes actuelles ont des valeurs valides correspondantes.

0
David L

Une autre option pourrait être que votre clé primaire dans la table source IS N'EST PAS non signée. J'ai donc résolu le même insert avec (remarque id int (8) non signée):

CREATE TABLE IF NOT PAS EXISTS user (id int (8) non signé NON null AUTO_INCREMENT, username varchar (32) COLLATE utf8_bin NON NULL,
password varchar (64) COLLATE utf8_bin NOT NULL, password_real char (32) COLLATE utf8_bin NON NULL, email varchar (32) COLLATE utf8_bin NON NULL, code char (8) COLLATE utf8_bin NON 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 NON NULL, name varchar (32) COLLATE utf8_bin NOT NULL, street varchar (32) COLLATE utf8_bin NON 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 NON NULL, Zip_code varchar (32) COLLATE utf8_bin NON NULL, phone_number varchar (16) COLLATE utf8_bin NON NULL, country int (8) NON NULL, province int (8) NOT NULL, pesel varchar (32) COLLATE utf8_bin NOT NULL,
register_time horodatage NOT NULL DEFAULT CURRENT_TIMESTAMP,
authorised_time datetime NON NULL, edit_time datetime NON NULL, saldo décimal (9,2) NON NUL, referer_id int (8) NON NUL,
level int (8) NON NUL, CLÉ PRIMAIRE (id), CLÉ country (country), KEY province (province), KEY referer_id (referer_id)) ENGINE = InnoDB DEFAULT CHARSET = utf8 COLLATE = utf8_bin AUTO_INCREMENT = 83;

0
Lubomir Andrisek

Dans mon cas, la valeur était vide pour la colonne de la table cible, contrairement à la colonne de la table de référence. par conséquent jetait cette erreur. 

0
R T