0

我有 2 个表,一个称为“Image”表,另一个称为“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 链接在一起,这样可以说我从 Image Table 中删除 ImageId = 01 的行,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,并且您似乎已经按照我在评论中的建议将其更改为。但这不是您的 CASCADE DELETE 不起作用的原因。

(附注:就数据组织而言,在 99.9% 的情况下,两个表具有相同的主键是没有意义的(只有真正的情况是隐藏信用卡号等敏感信息)。如果两个表具有相同的主键,它们应该是同一张表。)

既然你发布了你的CREATE TABLE声明,问题现在很明显——只InnoDB支持 MySQL 中的外键约束。MyISAM没有(还)。奇怪的是,它们允许您使用外键语法创建 MyISAM 表而没有错误并且不支持它。

按照您的设置方式,从表 Image 中删除一行将删除 Image_Question 中的相应行。那讲得通。

外键设置父->子关系。如果你杀了父母,孩子就会死。但是,如果你杀了一个孩子,那并不会杀死父母。父母将继续存在,并且可能有许多其他孩子。

您的每张图片可能有 50 个问题。当任何一个子问题被删除时,您不想删除父图像。但是,如果您删除 1 张图片,其所有子问题都将变得无关紧要且毫无用处。您可以级联删除,但您可以SET NULL或者NO ACTION如果您认为子数据在某些方面仍然有用。SET NULL 将使所有orphan行都相等,而 NO ACTION 将保留它们的无引用外键,因此即使父级消失,您仍然可以按父级对它们进行分组。

将表更改为 InnoDB 后,此查询应导致级联:

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

这将删除id 为 2 的一行Images因为id它是主键,每个值只能存在一行),并且还删除 id 为 2的所有行(可能存在数百万行)。Image_QuestionsImageId

ImageId另请注意,您将其作为第一列是很奇怪的,Image_Questions而且它不应该是主键。很少有理由让两个表具有完全相同的主键。的主键Image_Questions应该是QuestionId.

有关 MySQL 中外键支持的信息,请参阅此:

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

这是 ON DELETE 选项的链接:

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

于 2012-09-27T04:14:11.243 回答