108 votes

Violation de contrainte d'intégrité : 1452 Impossible d'ajouter ou de mettre à jour une ligne enfant :

Je tente d'insérer des valeurs dans ma table de commentaires et je reçois une erreur. Il dit que je ne peux pas ajouter ou mettre à jour une ligne enfant et je n'ai aucune idée de ce que cela signifie.

Mon schéma ressemble à ceci

-- ----------------------------
-- Structure de la table `comments`
-- ----------------------------
DROP TABLE IF EXISTS `comments`;
CREATE TABLE `comments` (
  `id` varchar(36) NOT NULL,
  `project_id` varchar(36) NOT NULL,
  `user_id` varchar(36) NOT NULL,
  `task_id` varchar(36) NOT NULL,
  `data_type_id` varchar(36) NOT NULL,
  `data_path` varchar(255) DEFAULT NULL,
  `message` longtext,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_comments_users` (`user_id`),
  KEY `fk_comments_projects1` (`project_id`),
  KEY `fk_comments_data_types1` (`data_type_id`),
  CONSTRAINT `fk_comments_data_types1` FOREIGN KEY (`data_type_id`) REFERENCES `data_types` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_comments_projects1` FOREIGN KEY (`project_id`) REFERENCES `projects` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_comments_users` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf32;

-- ----------------------------
-- Enregistrements des commentaires
-- ----------------------------

-- ----------------------------
-- Structure de la table `projects`
-- ----------------------------
DROP TABLE IF EXISTS `projects`;
CREATE TABLE `projects` (
  `id` varchar(36) NOT NULL,
  `user_id` varchar(36) NOT NULL,
  `title` varchar(45) DEFAULT NULL,
  `description` longtext,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_projects_users1` (`user_id`),
  CONSTRAINT `fk_projects_users1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf32;

-- ----------------------------
-- Enregistrements des projets
-- ----------------------------
INSERT INTO `projects` VALUES ('50dcbc72-3410-4596-8b71-0e80ae7aaee3', '50dcbc5c-d684-40bf-9715-0becae7aaee3', 'Nouveau projet de marque', 'C'est un tout nouveau projet', '2012-12-27 15:24:02', '2012-12-27 15:24:02');

et la déclaration mysql que j'essaie de faire ressemble à ceci

INSERT INTO `anthonyl_fbpj`.`comments` (`project_id`, `user_id`, `task_id`, `data_type_id`, `message`, `modified`, `created`, `id`) 
VALUES ('50dc845a-83e4-4db3-8705-5432ae7aaee3', '50dcbc5c-d684-40bf-9715-0becae7aaee3', '1', '50d32e5c-abdc-491a-a0ef-25d84e9f49a8', 'c'est un test', '2012-12-27 19:20:46', '2012-12-27 19:20:46', '50dcf3ee-8bf4-4685-aa45-4eb4ae7aaee3')

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 : une contrainte de clé étrangère échoue (anthonyl_fbpj.comments, CONTRAINTE fk_comments_projects1 CLÉ ÉTRANGÈRE (project_id) REFERENCES projects (id) ON DELETE NO ACTION ON UPDATE NO ACTION)

160voto

John Woo Points 132738

Cela signifie simplement que la valeur de la colonne project_id sur la table comments que vous insérez n'existe pas dans la table projects. Gardez à l'esprit que les valeurs de la colonne project_id sur la table comments dépendent des valeurs de ID sur la table Projects.

La valeur 50dc845a-83e4-4db3-8705-5432ae7aaee3 que vous insérez pour la colonne project_id n'existe pas dans la table projects.

31 votes

Et si j'ai une valeur dans cette table? J'ai la même erreur mais j'ai des valeurs dans la table et l'ID correspondant.

4 votes

J'ai eu un problème similaire. Supprimer les anciennes données de la table a résolu le problème dans mon cas.

3 votes

Yojan, quelle table devons-nous supprimer, la "parent" ou la "child" (dépendante) ?

57voto

Jyothu Points 1050

Assurez-vous d'avoir project_id dans la propriété fillable de votre modèle Comment.

J'ai eu le même problème, et c'était la raison.

8 votes

Ici aussi, en utilisant Laravel. Belle prise.

26voto

Si vous ajoutez une nouvelle clé étrangère à une table existante et que les colonnes ne sont pas nulles et qu'elles n'ont pas de valeur par défaut, vous obtiendrez cette erreur,

Soit vous devez le rendre nullable ou assigner une valeur par défaut, ou supprimer tous les enregistrements existants pour le résoudre.

2 votes

Rendre la colonne nullable a résolu le problème

0 votes

@ChamupathiGigaraHettige content que cela vous aide. :)

12voto

Assurez-vous également que la clé étrangère que vous ajoutez est du même type que la colonne d'origine, si la colonne que vous référencez n'est pas du même type, cela échouera également.

5voto

Aleksergio Points 51

J'espère que ma décision aidera. J'avais une erreur similaire dans Laravel. J'ai ajouté une clé étrangère à la mauvaise table.
Code incorrect:

 Schema :: create ('comments', function (Blueprint $table) {
$table-> unsignedBigInteger ('post_id')-> index ()-> nullable ();
...
$table-> foreign ('post_id')-> references ('id')-> on ('comments')-> onDelete ('cascade');
});

Schema :: create ('posts', function (Blueprint $table) {
$table-> bigIncrements ('id');
...
});

Veuillez noter la fonction on ('comments') ci-dessus. Code correct

 $table-> foreign ('post_id')-> references ('id')-> on ('posts')-> onDelete ('cascade');

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X