web-dev-qa-db-fra.com

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

J'essaie d'insérer des valeurs dans ma table de commentaires et j'obtiens une erreur. Sa disant que je ne peux pas ajouter ou mettre à jour la ligne enfant et je n'ai aucune idée de ce que cela signifie.

mon schéma ressemble à quelque chose comme ça

-- ----------------------------
-- Table structure for `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;

-- ----------------------------
-- Records of comments
-- ----------------------------

-- ----------------------------
-- Table structure for `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;

-- ----------------------------
-- Records of projects
-- ----------------------------
INSERT INTO `projects` VALUES ('50dcbc72-3410-4596-8b71-0e80ae7aaee3', '50dcbc5c-d684-40bf-9715-0becae7aaee3', 'Brand New Project', 'This is a brand new project', '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', 'this is a 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 de mettre à jour une ligne enfant: une contrainte de clé étrangère échoue (anthonyl_fbpj.comments, CONTRAINTES fk_comments_projects1 CLÉ ÉTRANGÈRE (project_id) RÉFÉRENCES projects (id) ON DELETE NO ACTION ON UPDATE NO ACTION)

60
numerical25

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

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

87
John Woo

Assurez-vous que vous avez 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.

33
Jyothu

Assurez-vous également que la clé étrangère que vous ajoutez est du même type que la colonne d'origine. Si la colonne à laquelle vous faites référence n'est pas du même type, elle échouera également.

5
tyan

Dans le cas où quelqu'un utilise Laravel et obtient ce problème. Je l'obtenais aussi et le problème était dans l'ordre dans lequel j'insérais les identifiants (c'est-à-dire les clés étrangères) dans le dossier tableau croisé dynamique.

Pour être concret, trouvez ci-dessous un exemple de relation plusieurs à plusieurs:

wordtokens <-> wordtoken_wordchunk <-> wordchunks

// wordtoken_wordchunk table
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']);
    });

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

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

Maintenant, mes modèles ressemblent à ce qui suit:

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 compléter le code, voici comment je persiste dans 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);
    }
}
1
narko

J'espère que ma décision aidera. J'ai eu une erreur similaire à Laravel. J'ai ajouté une clé étrangère à la mauvaise table.
Mauvais code:

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');
    ...
    });

S'il vous plaît noter à la fonction sur ('commentaires') ci-dessus. Code correct

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

Commencez par supprimer la contrainte "fk_comments_projects1" ainsi que son index. Après cela, recréez-le.

1
Sreerag AS

J'ai eu ce problème quand j'utilisais accidentellement le MAUVAIS "uuid" dans mon dossier enfant. Lorsque cela se produit, la contrainte, de l’enfant à l’enregistrement parent, vérifie 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. Donc, ma solution était:

$parent = Parent:create($recData); // asssigning autogenerated uuid into $parent

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

$parent->uuid

J'espère que ça t'as aidé.

0
Mark Löwe

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 pour lesquels le champ id correspondant est contenu dans la table de contenu.