2012-07-10 100 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