0

トランザクション中に関連付けテーブルに値を挿入すると、次のエラーが発生します。

Cannot add or update a child row: a foreign key constraint fails (dev.genre, CONSTRAINT fk_Genre_EntityType1 FOREIGN KEY (idEntityType) REFERENCES entitytype (idEntityType) ON DELETE NO ACTION ON UPDATE NO ACTION)

使用されるテーブルを説明するスキーマの一部を次に示します。

ここに画像の説明を入力

テーブルの作成ステートメントは次のgenreとおりです。

-- -----------------------------------------------------
-- Table `dev`.`Genre`
-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `dev`.`Genre` (
  `idGenre` INT NOT NULL ,
  `Name` VARCHAR(45) NULL COMMENT 'musique, spectacle, expo' ,
  `idEntityType` INT NOT NULL ,
  `idStyle` INT NOT NULL ,
  PRIMARY KEY (`idGenre`, `idEntityType`, `idStyle`) ,
  INDEX `fk_Genre_EntityType1_idx` (`idEntityType` ASC) ,
  INDEX `fk_Genre_Style1_idx` (`idStyle` ASC) ,
  CONSTRAINT `fk_Genre_EntityType1`
    FOREIGN KEY (`idEntityType` )
    REFERENCES `dev`.`EntityType` (`idEntityType` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_Genre_Style1`
    FOREIGN KEY (`idStyle` )
    REFERENCES `dev`.`Style` (`idStyle` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

再開するには、GenreテーブルはEntityTypeおよびStyleを参照します。それだけです。

Style新しいものを作成してからテーブルに関連付けを追加しようとすると、エラーが発生しGenreます。

すべてがトランザクション内にあり、私がしていることは次のとおりです。

  • Styleテーブルに新しいスタイルを作成する
  • 作成されたスタイルの ID を取得します
  • genreテーブルに関連付けを挿入すると、エラーが発生します。

私はウェブでかなりの時間を検索しましたが、私が見つけたのはこの SO 投稿だけでした: In MySQL, can I defer referential Integrity Checks until commit

トランザクション中に変更されていないテーブルでエラーが発生するため、これがここにあるのかどうかはわかりません ( EntityType)。または、何か不足していますか?

このエラーが発生した理由を誰かに説明してもらえますか? (私はここで立ち往生しています)

また、前に述べた SO の投稿と本当に関係がある場合、独自のロールバック メカニズムを作成せずにその種の挿入を行う「クリーンな」方法はありますか?

回答ありがとうございます

編集

新しいスタイルを挿入する最初のクエリは次のとおりです。

CREATE PROCEDURE `Entity_CreateStyle`
(
    IN p_name varchar(45),
    OUT op_idStyle int(11)
)
BEGIN
    insert into Style(idParentStyle, Name, IsValidated)
    values(null, p_name, 0);

    SET op_idStyle = LAST_INSERT_ID();
END

エラーを生成する次のもの:

CREATE PROCEDURE `Entity_AssociateStyleWithEntityType`
(
    IN p_idGenre int(11),
    IN p_Name varchar(45),
    IN p_idEntityType int(11),
    IN p_idStyle int(11)
)
BEGIN
    insert into Genre(idGenre, Name, idEntityType, idStyle)
    values(p_idGenre, p_Name, p_idEntityType, p_idStyle);
END

どちらも実際には、MySQL.Net コネクタを使用して C# から呼び出すストアド プロシージャです。

これp_idEntityTypeはモデル(MVC)からのもので、値が正しく、EntityTypeテーブルに存在することを確認しました。

4

1 に答える 1