向MySQL表添加约束

向MySQL表添加约束,mysql,Mysql,我有两个表,一个是命名学生表,另一个是命名成绩表,我正在尝试向成绩表添加外键约束,这样,如果有人从学生表中删除,他们的所有成绩也将被删除。我有一个名为TNumber的列来匹配2。这是到目前为止我的代码 ALTER TABLE Grades ADD CONSTRAINT fk_Grades FOREIGN KEY (TNumber) REFERENCES Students(TNumber) ON DELETE CASCADE; 问题是代码运行时没有创建外键。 有人

我有两个表,一个是命名学生表,另一个是命名成绩表,我正在尝试向成绩表添加外键约束,这样,如果有人从学生表中删除,他们的所有成绩也将被删除。我有一个名为TNumber的列来匹配2。这是到目前为止我的代码

    ALTER TABLE Grades
    ADD CONSTRAINT fk_Grades
    FOREIGN KEY (TNumber)
    REFERENCES Students(TNumber) ON DELETE CASCADE;
问题是代码运行时没有创建外键。 有人可以看看我的语法是否有问题,因为代码运行时没有抛出任何错误。

最可能的原因(以及注释中暗示的原因)是语句完成时没有错误,但似乎没有效果,因为其中一个或两个表都使用MyISAM引擎,这通常是默认值。这两个表都需要使用支持外键的引擎,例如InnoDB

如果您的表是MyISAM表,则可以使用以下内容创建表:

ALTER TABLE Students Engine=InnoDB;
ALTER TABLE Grades Engine=InnoDB;
之后,再次尝试添加外键。提示:外键约束中的列需要具有相同的类型。如果存在差异,您将得到极为无用的“E”错误消息

请注意,使用InnoDB引擎除了允许外键限制外(也请参见“”和可能出现的任何限制),但大多数限制都是有益的。

最可能的原因(以及评论中暗示的原因)假设语句完成时没有错误,但似乎没有效果,则其中一个表或两个表都使用MyISAM引擎,这通常是默认的。这两个表都需要使用支持外键的引擎,例如InnoDB

如果您的表是MyISAM表,则可以使用以下内容创建表:

ALTER TABLE Students Engine=InnoDB;
ALTER TABLE Grades Engine=InnoDB;
之后,再次尝试添加外键。提示:外键约束中的列需要具有相同的类型。如果存在差异,您将得到极为无用的“E”错误消息


请注意,使用InnoDB引擎除了允许外键限制外(请参见“”,还有可能出现的任何限制),但大多数限制都是有益的。

您是否使用可以处理外键的引擎?您是否介意为我们提供一个包含两个表的SHOW CREATE表?@Oswald这也是我的想法。可能不是InnoDB,如果我必须立即猜测的话。在我的创建表中,我没有声明引擎,所以它使用的是mysql中的默认引擎。关于
显示创建表
,请记住在寻求帮助时。要为DB相关问题创建一个表格,请包含创建表格的语句(如果询问查询),并用示例数据填充这些语句(
INSERT-To…
)。对于这样一个问题,如果问题不依赖于表中的数据,您可以省去语句,用示例数据填充表。您是否使用可以处理外键的引擎?您介意为我们提供一个包含两个表的SHOW CREATE TABLE吗?@Oswald这也是我的想法。可能不是InnoDB,如果我必须立即猜测的话。在我的创建表中,我没有声明引擎,所以它使用的是mysql中的默认引擎。关于
显示创建表
,请记住在寻求帮助时。要为DB相关问题创建一个表格,请包含创建表格的语句(如果询问查询),并用示例数据填充这些语句(
INSERT-To…
)。对于这样的问题,如果问题不依赖于表中的数据,您可以省去语句,用示例数据填充表格。在这种情况下,当您尝试添加时是否会引发异常?这就是表格使用MyISAM的问题。我的教授告诉我们创建表格时,他甚至从未说过要指定哪个引擎。在这种情况下,当您尝试添加时是否会引发异常?也就是说表使用MyISAM的问题我的教授告诉我们创建表,他甚至没有说要指定哪个引擎。