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)

5voto

aladin Points 11

Cela signifie que la valeur de la colonne project_id dans la table comments que vous insérez non seulement n'existe pas dans la table des projets MAIS aussi que project_id n'a probablement pas de valeur par défaut. Par exemple, dans mon cas, je l'ai défini comme NULL.

Concernant Laravel, vous pouvez considérer ces expressions comme un morceau de code d'un fichier de migration php, par exemple:

class ForeinToPhotosFromUsers extends Migration

{ /** * Exécuter les migrations. * * @return void */

public function up()
{
    Schema::table('users', function (Blueprint $table) {
    $table->unsignedBigInteger('photo_id')->nullable();// ! ! ! CETTE CHAÎNE ! ! !
    $table->foreign('photo_id')->references('id')->on('photos');
});
}

}

Évidemment, vous avez dû créer la classe de modèle (dans mon cas, c'était Photo) à côté de tout cela.

4voto

Sreerag AS Points 41

Tout d'abord, supprimez la contrainte "fk_comments_projects1" ainsi que son index. Ensuite, recréez-la.

4voto

KC Samm Points 41

Vous obtenez également cette erreur si vous ne créez pas et ne remplissez pas vos tables dans le bon ordre. Par exemple, selon votre schéma, la table des commentaires nécessite les colonnes user_id, project_id, task_id et data_type_id. Cela signifie que les tables Users, Projects, Task et Data_Type doivent déjà exister et contenir des valeurs avant que vous puissiez faire référence à leurs ids ou à toute autre colonne.

En Laravel, cela signifierait d'appeler vos séquenceurs de base de données dans le bon ordre :

class DatabaseSeeder extends Seeder
{
    /**
     * Seeder la base de données de l'application.
     *
     * @return void
     */
    public function run()
    {
        $this->call(UserSeeder::class);
        $this->call(ProjectSeeder::class);
        $this->call(TaskSeeder::class);
        $this->call(DataTypeSeeder::class);
        $this->call(CommentSeeder::class);
    }
}

C'est ainsi que j'ai résolu un problème similaire.

3voto

Peut-être avez-vous des lignes dans la table que vous souhaitez créer de FK.

Exécutez la migration avec foreign_key_checks OFF Insérez uniquement les enregistrements qui ont un champ id correspondant dans la table des contenus.

3voto

zehyr Points 31

Le problème pourrait provenir du fait qu'aucun enregistrement de projet n'a été trouvé dans la base de données avec l'identifiant de projet que vous essayez d'ajouter...

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