2012-07-10 69 views
4

嗨,伙计们,我只是在父表中创建父表的外键引用。当我尝试删除父表中的引用的父表中的行时,令人惊讶的是它允许我删除它。我试图通过在删除限制上写作,并且也没有它,但没有任何帮助,极力创建子表。任何想法为什么发生这种情况? .Below是我在创建表格时使用的代码。Mysql外键约束不起作用

CREATE TABLE region 
(
id int PRIMARY KEY AUTO_INCREMENT, 
name varchar(50) NOT NULL 
); 

CREATE TABLE aggregator 
(
id int PRIMARY KEY AUTO_INCREMENT, 
name varchar(50) NOT NULL 
); 

CREATE TABLE gateway 
(
id int PRIMARY KEY AUTO_INCREMENT, 
name varchar(50) NOT NULL, 
region_id int , 
aggregator_id int , 
is_public boolean DEFAULT 0 NOT NULL, 
FOREIGN KEY (region_id) REFERENCES region(id), 
FOREIGN KEY (aggregator_id) REFERENCES aggregator(id) 
); 
+0

你确定子表中有一行引用刚删除的父行吗? – zerkms 2012-07-10 04:07:10

+0

是的,我确定它 – 2012-07-10 04:11:36

回答

7

父表和子表都需要是INNODB表。

尝试:

CREATE TABLE region 
(
id int PRIMARY KEY AUTO_INCREMENT, 
name varchar(50) NOT NULL 
) ENGINE=INNODB; 

CREATE TABLE aggregator 
(
id int PRIMARY KEY AUTO_INCREMENT, 
name varchar(50) NOT NULL 
) ENGINE=INNODB; 

CREATE TABLE gateway 
(
id int PRIMARY KEY AUTO_INCREMENT, 
name varchar(50) NOT NULL, 
region_id int , 
aggregator_id int , 
is_public boolean DEFAULT 0 NOT NULL, 
FOREIGN KEY (region_id) REFERENCES region(id), 
FOREIGN KEY (aggregator_id) REFERENCES aggregator(id) 
) ENGINE=INNODB; 
+0

谢谢你的家伙它的工作。顺便说一句,为什么我们需要在所有创建表查询中编写ENGINE = INNODB?为什么没有它的外键约束没有工作?即使mysql正在发布新的东西,也必须有向后的压缩性 – 2012-07-10 04:25:24

+0

@vishnupratapsingh您可以更改配置以将默认引擎设置为INNODB。为什么没有外键约束没有工作就是因为INNODB引擎设计来支持它。 – xdazz 2012-07-10 04:29:37

0

不要的意思是说,如果你删除父表和子表中删除自动?如果是,那么一旦通过级联规则。

+0

否我的意思是说,当一行父表引用子表中,然后根据参照完整性的外键规则mysql不应该允许我从父表中删除该行,但实际上我能够删除来自父表的那一行没有任何错误 – 2012-07-10 04:16:17