2013-05-08 134 views
1

我在这里面临一个奇怪的问题。MYSQL不检查外键是否存在

表1:

create table degree (degree_id varchar(6) primary key , degree_name varchar(32) unique key , degree_abbr varchar(3)); 

表2:

create table course (course_id varchar(6) primary key , degree_id varchar(6) not null, course_name varchar(40) not null , foreign key (degree_id) references degree 
(degree_id)); 

现在据我了解SQL,我不能,如果场degree_id的值不插入过程表中的任何值存在于学位表中。

但是,如果我尝试插入类似

insert into course values('cor_001' , 'blah' , 'COURSE NAME'); 

这个查询成功运行,即使“胡说”不是一个有效的degree_id。

回答

3

你可能使用MyISAM表,它不支持外键。 FK指令被解析并接受,然后被忽略。

您需要使用InnoDB表进行适当的FK支持:

CREATE TABLE (...) ENGINE=InnoDB; 
        ^^^^^^^^^^^^^^ 

如果你做一个show create table your_table,你会看到在输出端使用的发动机类型。

+0

是的,这是正确的。现在我该如何改变它们以使用InnoDB?我已经创建和填充了很多表格。我无法放下桌子。 – 2013-05-08 15:49:30

+0

'alter table yourtable engine = innodb'。您将不得不进一步修改表格以重新应用FK定义。一旦myisam完成了“创建”查询,它们就会丢失。 – 2013-05-08 15:51:00

+0

K.所以我需要先修改所有引擎,然后修改表来应用外键。无论如何改变MySQL的默认引擎?这样我每次创建表时都不需要提及ENGINE属性。 – 2013-05-08 15:53:59