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)

2voto

narko Points 1767

Si quelqu'un utilise Laravel et rencontre ce problème. J'ai également rencontré ce problème et la solution résidait dans l'ordre dans lequel j'insérais les ids (c'est-à-dire, les clés étrangères) dans la table pivot.

Pour être concret, voici un exemple pour une relation de plusieurs à plusieurs :

wordtokens <-> wordtoken_wordchunk <-> wordchunks

// table wordtoken_wordchunk
Schema::create('wordtoken_wordchunk', function(Blueprint $table) {
        $table->integer('wordtoken_id')->unsigned();
        $table->integer('wordchunk_id')->unsigned();

        $table->foreign('wordtoken_id')->references('id')->on('word_tokens')->onDelete('cascade');
        $table->foreign('wordchunk_id')->references('id')->on('wordchunks')->onDelete('cascade');

        $table->primary(['wordtoken_id', 'wordchunk_id']);
    });

// table wordchunks
Schema::create('wordchunks', function (Blueprint $table) {
        $table->increments('id');
        $table->timestamps();
        $table->string('text');
    });

// table word_tokens
Schema::create('word_tokens', function (Blueprint $table) {
        $table->increments('id');
        $table->string('text');
});

Maintenant mes modèles ressemblent à ceci :

class WordToken extends Model
{
   public function wordchunks() {
      return $this->belongsToMany('App\Wordchunk');
   }
}

class Wordchunk extends Model
{

    public function wordTokens() {
        return $this->belongsToMany('App\WordToken', 'wordtoken_wordchunk', 'wordchunk_id', 'wordtoken_id');
    }
}

J'ai résolu le problème en échangeant l'ordre de 'wordchunk_id' et 'wordtoken_id' dans le modèle Wordchunk.

Pour la complétion du code, voici comment je persiste les modèles :

private function persistChunks($chunks) {
    foreach ($chunks as $chunk) {
        $model = new Wordchunk();
        $model->text = implode(' ', array_map(function($token) {return $token->text;}, $chunk));
        $tokenIds = array_map(function($token) {return $token->id;}, $chunk);
        $model->save();
        $model->wordTokens()->attach($tokenIds);
    }
}

1voto

Mark Löwe Points 94

J'ai eu ce problème quand j'utilisais accidentellement le MAUVAIS "uuid" dans mon enregistrement enfant. Lorsque cela se produit, la contrainte recherche dans l'enregistrement enfant celui du parent pour s'assurer que le lien est correct. Je le générais manuellement alors que j'avais déjà configuré mon Modèle pour le faire automatiquement. Alors ma correction a été :

$parent = Parent::create($recData); // attribuer l'uuid généré automatiquement à $parent

Ensuite, lorsque j'ai appelé ma classe enfant pour insérer des enfants, j'ai passé cette valeur de variable :

$parent->uuid

J'espère que cela vous aidera.

1voto

Artur Junior Points 57

J'ai eu la même erreur, le problème était que j'essayais d'ajouter role_id comme clé étrangère à la table users, mais role_id n'avait pas de valeur par défaut, donc la base de données ne m'a pas permis d'insérer la colonne car j'avais déjà certains utilisateurs et elle ne savait pas comment ajouter la colonne à ceux-ci. Comme j'étais en développement, j'ai simplement utilisé migrate:fresh, mais si j'étais en production, je définirais probablement une valeur par défaut pour role_id et ne le rendrais pas contraignant tant que je n'aurais pas le rôle correspondant dans la base de données.

1voto

Il se pourrait que vous insériez une valeur de clé étrangère qui ne correspond pas à celle de la clé primaire.

1voto

Keliz Zorrilla Points 11

Dans mon cas, cela n'a pas fonctionné parce que je laissais un espace dans l'un des noms du modèle.

image

0 votes

Salut, cela m'a fait réaliser que je n'avais pas ajouté le champ de relation comme remplissable.

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