【问题标题】:How to write an SQL statement for example below如何编写 SQL 语句,例如下面
【发布时间】:2012-09-27 20:53:33
【问题描述】:

我在下面有 2 个数据库表:

问题表

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

Image_Question 表

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 表中的相应行。由于问题表中删除的行由 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;

【问题讨论】:

  • 对不起,sessionId也是问题表中的主键
  • @njk 我更新了包含我尝试过的 sql 语句的问题

标签: mysql sql


【解决方案1】:

您的约束完全正确。基本表定义一定有问题。也许您发布您的CREATE TABLE 声明。我的实验都成功了。看看我的日志:

我已经在以下SQL Fiddle 的创建表中尝试过它并且它有效:

...
                            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 中为约束命名。结果一样。

编辑:您的QUESTION 表上是否有INDEX,以便FOREIGN KEY 正确引用?我意识到您的FOREIGN KEY 是不同的序列SessionID,QuestionID 而不是QuestionId,SessionId,这没关系,只要QUESTION 表中的INDEX 也是按该顺序排列的。

编辑 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

【讨论】:

  • 问题是问题表不是InnoDB,其他表是
  • 啊,很好,你发现了。很高兴我的示例帮助您解决了问题。老实说,我也学到了一些东西。
  • 我这里做了例子sqlfiddle.com/#!2/16839/1CREATE INDEX或者ALTER TABLE ... ADD PRIMARY KEY
  • 非常感谢您的帮助和回答 :)
【解决方案2】:
DELETE FROM Image_Question 
WHERE QuestionID = 1 AND SessionId = AAB;

【讨论】:

  • 我不是那个意思,我的意思是如何向多个列添加约束,然后能够使用 ON DELETE CASCADE 删除行。我在我的问题中包含了一个关于我尝试过的示例
【解决方案3】:

使用外键约束,您必须有唯一的方法来识别两个表上的记录。由于您在Questions 表(QuestionIdSessionId(PK))上有一个复合主键,因此您需要创建一个引用复合键的约束。因此,您需要在Image_Question 表(ImageQuestionIdSessionId)上创建一个键复合键。

【讨论】:

  • 如果您不介意,能否提供一个示例代码,说明如何用 SQL 编写代码?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-26
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多