2011-03-15 85 views
1
> CREATE TABLE student(
-> student_id INT(2) NOT NULL AUTO_INCREMENT PRIMARY KEY, 
-> first_name VARCHAR(10), 
-> last_name VARCHAR(10) 
->); 

> CREATE TABLE course(
-> course_id CHAR(5) NOT NULL PRIMARY KEY, 
-> course_name VARCHAR(50), 
-> student_id INT(2) NOT NULL, 
-> CONSTRAINT student_student_id_fk 
-> FOREIGN KEY (student_id) 
-> REFERENCES student(student_id) 
->); 

那就是我如何创建两个表,即学生和课程。然后我在学生表中输入数据。但是当我在课程表中输入一些无效的数据时,它不会给我任何错误。 例如: VALUES('A1','SUB 1',34);即使学生表中没有主键'34', 也会获得课程表中的条目。如何在mysql中强制约束

此外,我可以删除学生表中的记录,即使有参照完整性。 那么,怎样才能强制约束呢?

+0

我很乐意为您提供帮助,但偶尔您会点击旁边的勾号,以帮助您确认帮助。 – RichardTheKiwi 2011-03-15 17:39:47

回答

3

最简单的方法是将您的存储引擎更改为支持约束的InnoDB。

对于旧MyISAM表,你将不得不使用两侧触发器来强制执行FK关系

自救

一些链接像这样创建你的餐桌

> CREATE TABLE student(
-> student_id INT(2) NOT NULL AUTO_INCREMENT PRIMARY KEY, 
-> first_name VARCHAR(10), 
-> last_name VARCHAR(10) 
->) ENGINE = INNODB; 

> CREATE TABLE course(
-> course_id CHAR(5) NOT NULL PRIMARY KEY, 
-> course_name VARCHAR(50), 
-> student_id INT(2) NOT NULL, 
-> CONSTRAINT student_student_id_fk 
-> FOREIGN KEY (student_id) 
-> REFERENCES student(student_id) 
->) ENGINE = INNODB; 
+0

我真的不明白'InnoDB'的存储引擎,对不起,我是初学者。 – Gopal 2011-03-15 05:36:30

+0

@Gopal - MySQL附带了各种实际管理数据的存储引擎。您可以为每个表指定一个不同的引擎。如果你不指定引擎,它将使用默认引擎MyISAM。它对于很多事情来说很快(这就是为什么它是默认的),但它不像你想要的那样支持外键约束。 InnoDB引擎的确如此。 – 2011-03-15 05:44:57

+0

当我使用代码SHOW CREATE TABLE当然,我得到这个:course | CREATE TABLE'course'( 'course_id' char(5)NOT NULL, 'course_name' varchar(50)DEFAULT NULL, 'student_id' int(2)NOT NULL, PRIMARY KEY('course_id'), KEY 'student_student_id_fk'('student_id') )ENGINE = MyISAM DEFAULT CHARSET = latin1 | – Gopal 2011-03-15 05:48:58

0

对于具有相同问题的人,如果您已经使用MyISAM创建了表,则可以将其更改为InnoDB。

ALTER TABLE table_name ENGINE = InnoDB;