トランザクション中に関連付けテーブルに値を挿入すると、次のエラーが発生します。
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
テーブルに存在することを確認しました。