2011-04-23 48 views
1

我有两个表,一个名为Students,一个名为Grades,我试图给Grades表添加一个外键约束,这样如果有人从Students表中删除,所有的成绩都会被删除也被删除。我有一个名为TNumber的列来匹配2.这是我的代码到目前为止。向MySQL表添加一个约束

ALTER TABLE Grades 
    ADD CONSTRAINT fk_Grades 
    FOREIGN KEY (TNumber) 
    REFERENCES Students(TNumber) ON DELETE CASCADE; 

问题是代码运行但它不创建外键。 有人可能只是看着它,看看我在我的语法中做错了什么,因为代码运行并不会引发任何错误。

+0

你使用可以处理外键的引擎吗? – Oswald 2011-04-23 00:18:12

+1

你介意给我们两张表的SHOW CREATE TABLE吗? – Cthos 2011-04-23 00:19:43

+0

@Oswald这就是我的想法。可能不是InnoDB,如果我不得不亲自猜测。 – Cthos 2011-04-23 00:20:26

回答

4

最可能的原因(和在评论中暗示的)声明完成没有错误,但似乎没有效果是一个或两个表使用MyISAM引擎,这通常是默认的。两个表都需要使用支持外键的引擎,比如InnoDB。

如果你的表是MyISAM表,你可以convert them to InnoDB表有以下几点:

ALTER TABLE Students Engine=InnoDB; 
ALTER TABLE Grades Engine=InnoDB; 

之后,重新尝试添加外键。向上看:外键约束中的列需要具有相同的类型。如果有差异,你会得到极其无用的“E RROR 1005 (HY000): Can't create table filename (errno: 150)”错误信息。

注意,使用InnoDB引擎具有consequences(另见“Storage Engine Performance Benchmark for MyISAM and InnoDB”和任何一个web search可以转动起来)超出允许外键约束,但其中大部分都是有益的。

+0

谢谢我可能需要检查 – 2011-04-23 00:23:57

+0

在这种情况下,当您尝试添加它时是否会引发异常? – 2011-04-23 00:24:19

+0

这是表格使用MyISAM的问题,我的教授告诉我们要创建表格,他甚至从来没有说过要指定什么引擎。 – 2011-04-23 00:29:29