foreign_key_checks
0に設定されている間にInnoDBテーブルに挿入された後、単一の行の参照整合性をチェックする方法があるかどうかを確認しようとしています.
したがって、次の 2 つのテーブルが与えられます。
CREATE TABLE `book` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`author_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `book_cc846901` (`author_id`),
CONSTRAINT `author_id_refs_id_7fdd0933` FOREIGN KEY (`author_id`) REFERENCES `person` (`id`)
) ENGINE=InnoDB;
CREATE TABLE `person` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
それらに対して次のステートメントを実行します。
SET foreign_key_checks=0
INSERT INTO `book` (`id`, `name`, `author_id`) VALUES (1, 'Cryptonomicon', 3)
INSERT INTO `person` (`id`, `name`) VALUES (4, 'Neal Stephenson')
SET foreign_key_checks=1
ここにいくつかの悪いデータを入れました -- author_id は存在しない person.id を参照していますこのように。
私が最初に取ろうとしていたアプローチは、まったく同じデータで行を更新することでした。私はこれを試しました:
UPDATE `book` SET `name` = 'Cryptonomicon', `author_id` = 3 WHERE `book`.`id` = 1
これによりエラーが発生すると予想していましたが、そうではありませんでした。データが変更されていないため、明らかに整合性チェックは行われていませんか? たとえば、 author_id を 2 に設定すると失敗します。
私の質問: 特定の行を検査し、問題がある場合に整合性エラーをトリガーできる代替手段はありますか? 私は周りをグーグルで検索しましたが、何も見つかりませんでした。テーブル全体をチェックすることは避けたいのですが、それが唯一のルートかもしれません。
私を逃れている洞察やその他のアプローチをいただければ幸いです。
(なぜ私がこれをすべてやろうとしているのか知りたいのであれば、それは、前方参照を持つフィクスチャをロードできないという Django フレームワークで未解決の問題を解決しようとしているからです。提案された解決策は、外部キー チェックを無効にすることです。フィクスチャがロードされ、ロードが完了した後に再び有効になったとき私は、その時点で戻って、外部キーチェックがオフのときに追加された行の参照整合性をチェックし、エラーを発生させる方法を理解しようとしています。問題がある場合はエラーになります。)