0

以下に 2 つのデータベース テーブルがあります。

質問表

QuestionId(Pk)  SessionId(PK)   Question
1               AAA             my name is
2               AAA             my age is
1               AAB             my DOB is

画像_質問表

ImageQuestionId(Pk)  ImageId   SessionId   QuestionId
1                    1         AAB         1
2                    2         AAA         2 
3                    3         AAA         1

私がしたいことは、ユーザーが質問表からこの行を削除した場合です:

1               AAB         my DOB is

SessionId と Question Id の両方を参照して、Image_Question テーブルの対応する行を削除したいと思います。Question テーブルから削除された行は SessionId = AAB および QuestionId = 1 で構成されているため、SessionId = AAB AND QuestionId = 1 を含む Image_Question テーブルから対応する行を削除する必要があります。画像の質問は以下のとおりです。

1                    1         AAB         1

これは、SessionId と QuestionId の両方が質問テーブルから削除された行と一致するためです。

このためのSQLコードの書き方を知っている人はいますか?

アップデート:

以下は私が試したことですか?

ALTER TABLE Image_Question ADD CONSTRAINT FK_SessionQuestion FOREIGN KEY (SessionId,QuestionId) REFERENCES Question (SessionId,QuestionId) ON DELETE CASCADE;
4

3 に答える 3

1

あなたはあなたの制約でそれを完全に正しくやっています。基本的なテーブル定義に問題があるはずです。多分あなたはあなたのCREATE TABLE声明を投稿します。私の実験はすべて成功します。私のログを見てください:

次のSQL Fiddleのcreate tableで試してみましたが、うまくいきます:

...
                            FOREIGN KEY (QuestionId,SessionId) 
                             REFERENCES Question(QuestionId,SessionId)
                             ON DELETE CASCADE
...

しかし、あなたが望むのは、後で追加することです。そこで、後で制約を追加したときにも機能する別のSQL Fiddleを作成しました。

ALTER TABLE Image_Question ADD CONSTRAINT
                           FOREIGN KEY (QuestionId,SessionId) 
                             REFERENCES Question(QuestionId,SessionId)
                             ON DELETE CASCADE;

唯一のことは、これがあなたがしていることとまったく同じように見えるということです:

ALTER TABLE Image_Question ADD CONSTRAINT FK_SessionQuestion 
                            FOREIGN KEY (SessionId,QuestionId) 
                            REFERENCES Question (SessionId,QuestionId) 
                            ON DELETE CASCADE;

このSQL Fiddleで制約に名前を付けてみました。同じ結果です。

編集:が正しく参照されるように、テーブルに がありINDEXますか? 表にあるあなたもその順序である限り、どちらが良いかではなく、あなたの順序が異なることに気付きました。QUESTIONFOREIGN KEYFOREIGN KEYSessionID,QuestionIDQuestionId,SessionIdINDEXQUESTION

編集2:ここに完全なもの:

CREATE TABLE Question (QuestionId INT      NOT NULL, 
                       SessionId  CHAR(3)  NOT NULL,
                       Question   CHAR(10) NOT NULL ) ENGINE=INNODB;

INSERT INTO Question VALUES (1,'AAA','my name is');
INSERT INTO Question VALUES (2,'AAA','my age is');
INSERT INTO Question VALUES (1,'AAB','my DOB is');

-- This is how to add a primary key afterwards
ALTER TABLE QUESTION ADD PRIMARY KEY(SessionId,QuestionId);

CREATE TABLE Image_Question (ImageQuestionId INT     NOT NULL, 
                             ImageId          INT     NOT NULL,
                             SessionId        CHAR(3) NOT NULL,
                             QuestionId       INT     NOT NULL,
                            PRIMARY KEY (ImageQuestionId)
                            ) ENGINE=INNODB;

INSERT INTO Image_Question VALUES (1,1,'AAB',1);
INSERT INTO Image_Question VALUES (2,2,'AAA',2);
INSERT INTO Image_Question VALUES (3,3,'AAA',1);

-- This is how to just add an index afterwards
CREATE INDEX par_ind on Image_Question (SessionId,QuestionId);

ALTER TABLE Image_Question ADD CONSTRAINT FK_CONSTRAINT_NAME
                           FOREIGN KEY (SessionId,QuestionId) 
                             REFERENCES Question(SessionId,QuestionId)
                             ON DELETE CASCADE;

delete from Question where QuestionId = 1 and SessionId = 'AAB';

そしてSQL Fiddleとして

于 2012-09-27T21:42:08.777 に答える
0

外部キー制約を使用するには、両方のテーブルのレコードを識別する独自の方法が必要です。Questionsテーブル(QuestionId& )に複合主キーがSessionId(PK)あるため、複合キーを参照する制約を作成する必要があります。したがって、Image_Questionテーブル(ImageQuestionIdSessionId)にキー複合キーを作成する必要があります。

于 2012-09-27T21:17:35.643 に答える
0
DELETE FROM Image_Question 
WHERE QuestionID = 1 AND SessionId = AAB;
于 2012-09-27T20:57:16.940 に答える