0

2つのテーブルがあります。1つは「Image」テーブル、もう1つは「Image_Question」テーブルです。以下は、2つのテーブルがどのように見えるかを示しています。

画像表:

ImageId   ImageFile
01        picture/cat.png
02        picture/cat_2.png
03        picture/dog.png

Image_Questionテーブル:

ImageId  SessionId  QuestionId
01            ADS            3
02            FTG            7
03            JJK            1

私の質問は、SQLで、両方のテーブルのImageIdがリンクされ、ImageId = 01のImageTableから行を削除し、Image_QuestionテーブルのImageId = 01(対応する行)がまた、削除されました。

以下のコードを試しましたが、機能しませんでした。

ALTER TABLE Image_Question ADD CONSTRAINT FK_ImageId FOREIGN KEY (ImageId) REFERENCES Image (ImageId) ON DELETE CASCADE; 

アップデート:

画像テーブルを表示:

CREATE TABLE `Image` (
 `ImageId` int(10) NOT NULL AUTO_INCREMENT,
 `ImageFile` varchar(250) NOT NULL,
 PRIMARY KEY (`ImageId`)
) ENGINE=MyISAM AUTO_INCREMENT=399 DEFAULT CHARSET=utf8

IMAGE_QUESTIONテーブルを表示:

CREATE TABLE `Image_Question` (
 `ImageQuestionId` int(10) NOT NULL AUTO_INCREMENT,
 `ImageId` int(10) NOT NULL,
 `SessionId` varchar(10) NOT NULL,
 `QuestionId` int(5) NOT NULL,
 PRIMARY KEY (`ImageQuestionId`),
 KEY `QuestionId` (`QuestionId`),
 KEY `SessionId` (`SessionId`),
 KEY `fk_imagequestionid` (`ImageId`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
4

1 に答える 1

0

私の知る限り、外部キーの唯一の要件は、それがインデックスであることです。キー入力はでImage_Questionsある必要がありQuestionIdます。コメントでの私の提案に従って、キー入力はすでに変更されているようです。しかし、それがCASCADEDELETEが機能しない理由ではありません。

(補足:データ編成に関する限り、99.9%のケースで2つのテーブルに同じ主キーを使用することは意味がありません(実際のケースは、クレジットカード番号などの機密情報を非表示にすることだけです)。同じ主キー、それらは同じテーブルである必要があります。)

CREATE TABLEステートメントを投稿したので、問題は完全に明白InnoDBになりました-MySQLの外部キー制約のみをサポートします。MyISAM(まだ)しません。エラーなしで外部キー構文を使用してMyISAMテーブルを作成でき、それをサポートしていないのは奇妙で誤解を招く恐れがあります。

設定方法で、テーブルImageから行を削除すると、Image_Questionの対応する行が削除されます。それは理にかなっている。

外部キーは、親->子の関係を設定します。あなたが親を殺すと、子供は死にます。しかし、あなたが子供を殺しても、それは親を殺しません。親は存続し、他にも多くの子供がいる可能性があります。

各画像には50の質問があるかもしれません。これらの子の質問のいずれかが削除されたときに、親の画像を削除したくありません。ただし、1つの画像を削除すると、その子の質問はすべて無関係になり、役に立たなくなります。カスケード削除を行うことはできますがSET NULLNO ACTION子データが何らかの形で引き続き役立つ可能性がある場合は可能です。SET NULLはすべてのorphan行を等しくしますが、NO ACTIONはそれらの参照対象のない外部キーを保持するため、親がなくなっても親ごとにグループ化できます。

テーブルをInnoDBに変更すると、このクエリはカスケードになります。

DELETE FROM `Images` WHERE `id` = 2;

これにより、idが2の場所から1つの行が削除され(主キーであり、値ごとに1つの行しか存在できないため)、また、が2の場所からすべての行が削除されます(数百万の行が存在する可能性があります)。ImagesidImage_QuestionsImageId

ImageIdまた、の最初の列として持つのは非常に奇妙でImage_Questionsあり、主キーであってはならないことに注意してください。まったく同じ主キーを持つ2つのテーブルを使用する理由はほとんどありません。の主キーは。であるImage_Questions必要がありQuestionIdます。

MySQLでの外部キーのサポートについては、次を参照してください。

http://dev.mysql.com/doc/refman/5.5/en/ansi-diff-foreign-keys.html

ONDELETEオプションへのリンクは次のとおりです。

http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

于 2012-09-27T04:14:11.243 に答える