2010-05-11 65 views
3

這是我的表:MySQL的外鍵約束消失

/* oefenreeks leerplan */ 
CREATE TABLE leerplan_oefenreeks ( 
    leerplan_oefenreeks_id INT PRIMARY KEY AUTO_INCREMENT NOT NULL, 
    leerplan_id   INT NOT NULL, 
    oefenreeks_id   INT NOT NULL, 
    plaats     INT NOT NULL 
); 

/* fk */ 
ALTER TABLE leerplan_oefenreeks ADD CONSTRAINT fk_leerp_oefenr_leerplan 
FOREIGN KEY(leerplan_id) REFERENCES leerplan (leerplan_id) ON DELETE CASCADE; 

ALTER TABLE leerplan_oefenreeks ADD CONSTRAINT fk_leerp_oefenr_oefenreeks 
FOREIGN KEY(oefenreeks_id) REFERENCES oefenreeks (oefenreeks_id) ON DELETE CASCADE; 

/* when I execute the nexline, my fk_leerp_oefenr_leerplan constraint vanishes/disappears*/ 
ALTER TABLE leerplan_oefenreeks ADD CONSTRAINT un_leerp_oefenr UNIQUE(leerplan_id, oefenreeks_id); 

ALTER TABLE leerplan_oefenreeks ADD CONSTRAINT un_leerp_oefenr_plaats UNIQUE(leerplan_id, plaats); 

當我去檢查只有3個約束條件存在。 fk_leerp_oefenr_leerplan消失。我不明白爲什麼會發生這種情況。

+0

leerplan表的定義是什麼?您在創建fk_leerp_oefenr_leerplan約束時是否收到錯誤消息? – 2010-05-11 11:40:59

回答

0

我想弄清楚的事情,這是表看起來像外鍵約束已經到位後:

CREATE TABLE `leerplan_oefenreeks` (
    `leerplan_oefenreeks_id` int(11) NOT NULL AUTO_INCREMENT, 
    `leerplan_id` int(11) NOT NULL, 
    `oefenreeks_id` int(11) NOT NULL, 
    `plaats` int(11) NOT NULL, 
    PRIMARY KEY (`leerplan_oefenreeks_id`), 
    KEY `fk_leerp_oefenr_leerplan` (`leerplan_id`), 
    KEY `fk_leerp_oefenr_oefenreeks` (`oefenreeks_id`), 
    CONSTRAINT `fk_leerp_oefenr_oefenreeks` FOREIGN KEY (`oefenreeks_id`) REFERENCES `oefenreeks` (`oefenreeks_id`) ON DELETE CASCADE, 
    CONSTRAINT `fk_leerp_oefenr_leerplan` FOREIGN KEY (`leerplan_id`) REFERENCES `leerplan` (`leerplan_id`) ON DELETE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ; 

通知的fk_leerp_oefenr_leerplan和fk_leerp_oefenr_oefenreeks指標mysql的自動添加。

後添加的第一個唯一鍵約束:

ALTER TABLE leerplan_oefenreeks ADD CONSTRAINT un_leerp_oefenr UNIQUE(leerplan_id, oefenreeks_id); 

Mysql的刪除,因爲它不再需要以支持leerplan_id列的外鍵檢查fk_leerp_oefenr_leerplan指數。在這一點上,表看起來是這樣的:

CREATE TABLE `leerplan_oefenreeks` (
    `leerplan_oefenreeks_id` int(11) NOT NULL AUTO_INCREMENT, 
    `leerplan_id` int(11) NOT NULL, 
    `oefenreeks_id` int(11) NOT NULL, 
    `plaats` int(11) NOT NULL, 
    PRIMARY KEY (`leerplan_oefenreeks_id`), 
    UNIQUE KEY `un_leerp_oefenr` (`leerplan_id`,`oefenreeks_id`), 
    KEY `fk_leerp_oefenr_oefenreeks` (`oefenreeks_id`), 
    CONSTRAINT `fk_leerp_oefenr_leerplan` FOREIGN KEY (`leerplan_id`) REFERENCES `leerplan` (`leerplan_id`) ON DELETE CASCADE, 
    CONSTRAINT `fk_leerp_oefenr_oefenreeks` FOREIGN KEY (`oefenreeks_id`) REFERENCES `oefenreeks` (`oefenreeks_id`) ON DELETE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ; 

長話短說,SQLyog的只顯示索引以它的樹視圖在左邊,如果你想看到的外鍵,在樹視圖中選擇表並按下F10。

0

除了Konerak's suggestion,請注意,使用MyISAM(這是MySQL的默認存儲引擎)時不會創建外鍵約束。您可以使用InnoDB而是通過在CREATE TABLE語句中指定它:

CREATE TABLE leerplan_oefenreeks ( 
    leerplan_oefenreeks_id INT PRIMARY KEY AUTO_INCREMENT NOT NULL, 
    leerplan_id   INT NOT NULL, 
    oefenreeks_id   INT NOT NULL, 
    plaats     INT NOT NULL 
) ENGINE=InnoDB; 

測試用例爲默認存儲引擎,的MyISAM

CREATE TABLE t1 (id int PRIMARY KEY); 
CREATE TABLE t2 (id int, t1_id int); 

ALTER TABLE t2 ADD CONSTRAINT fk_t1t2 
FOREIGN KEY(t1_id) REFERENCES t1 (id) ON DELETE CASCADE; 

SELECT * 
FROM  information_schema.KEY_COLUMN_USAGE 
WHERE table_name ='t2' AND 
     constraint_name <>'PRIMARY' AND referenced_table_name is not null; 

Empty set (0.08 sec) 

測試用例InnoDB的存儲引擎:

CREATE TABLE t1 (id int PRIMARY KEY) ENGINE=InnoDB; 
CREATE TABLE t2 (id int, t1_id int) ENGINE=InnoDB; 

ALTER TABLE t2 ADD CONSTRAINT fk_t1t2 
FOREIGN KEY(t1_id) REFERENCES t1 (id) ON DELETE CASCADE; 

SELECT * 
FROM  information_schema.KEY_COLUMN_USAGE 
WHERE table_name ='t2' AND 
     constraint_name <>'PRIMARY' AND referenced_table_name is not null; 

+--------------------+-------------------+-----------------+---------------+ 
| CONSTRAINT_CATALOG | CONSTRAINT_SCHEMA | CONSTRAINT_NAME | TABLE_CATALOG | 
+--------------------+-------------------+-----------------+---------------+ 
| NULL    | test    | fk_t1t2   | NULL   | 
+--------------------+-------------------+-----------------+---------------+ ... 
1 row in set (0.00 sec) 
0

試試這個方法:

ALTER TABLE leerplan_oefenreeks ADD UNIQUE KEY `un_leerp_oefenr` (leerplan_id, oefenreeks_id); 

ALTER TABLE leerplan_oefenreeks ADD UNIQUE KEY `un_leerp_oefenr_plaats` (leerplan_id, plaats); 

ALTER TABLE leerplan_oefenreeks ADD CONSTRAINT fk_leerp_oefenr_leerplan 
FOREIGN KEY(leerplan_id) REFERENCES leerplan (leerplan_id) ON DELETE CASCADE; 

ALTER TABLE leerplan_oefenreeks ADD CONSTRAINT fk_leerp_oefenr_oefenreeks 
FOREIGN KEY(oefenreeks_id) REFERENCES oefenreeks (oefenreeks_id) ON DELETE CASCADE; 

EDITED OP的評論

之後,我已經試過你的代碼,你的結果沒有複製。 我簡化了leerplan和oefenreeks表:

CREATE TABLE leerplan_oefenreeks ( 
    leerplan_oefenreeks_id INT PRIMARY KEY AUTO_INCREMENT NOT NULL, 
    leerplan_id   INT NOT NULL, 
    oefenreeks_id   INT NOT NULL, 
    plaats     INT NOT NULL 
) engine=innodb; 


CREATE TABLE leerplan ( 
    leerplan_id INT PRIMARY KEY AUTO_INCREMENT NOT NULL, 
    leerplan_data   INT NOT NULL 
)engine=innodb; 


CREATE TABLE oefenreeks ( 
    oefenreeks_id INT PRIMARY KEY AUTO_INCREMENT NOT NULL, 
    oefenreeks_data   INT NOT NULL 
)engine=innodb; 

然後我跑了所有的ALTER TABLE語句,並在其後:

show create table leerplan_oefenreeks; 


CREATE TABLE `leerplan_oefenreeks` (
    `leerplan_oefenreeks_id` int(11) NOT NULL AUTO_INCREMENT, 
    `leerplan_id` int(11) NOT NULL, 
    `oefenreeks_id` int(11) NOT NULL, 
    `plaats` int(11) NOT NULL, 
    PRIMARY KEY (`leerplan_oefenreeks_id`), 
    UNIQUE KEY `un_leerp_oefenr` (`leerplan_id`,`oefenreeks_id`), 
    UNIQUE KEY `un_leerp_oefenr_plaats` (`leerplan_id`,`plaats`), 
    KEY `fk_leerp_oefenr_oefenreeks` (`oefenreeks_id`), 
    CONSTRAINT `fk_leerp_oefenr_leerplan` FOREIGN KEY (`leerplan_id`) REFERENCES `leerplan` (`leerplan_id`) ON DELETE CASCADE, 
    CONSTRAINT `fk_leerp_oefenr_oefenreeks` FOREIGN KEY (`oefenreeks_id`) REFERENCES `oefenreeks` (`oefenreeks_id`) ON DELETE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

我使用的是:服務器版本:39年1月5日,MySQL的日誌社區服務器(GPL)64bit,kubuntu 9.04。

你還有什麼不同?

+0

ssry, 它執行沒有問題,但是當我檢查fk_leerp_oefenr_leerplan未被添加。 之後,我嘗試執行此約束分開,但它沒有幫助。我得到(4排(s)受影響),但仍然沒有添加 – Bramjam 2010-05-11 14:47:28

+0

ty男子。我想我發現了這個問題。似乎fk實際上存在,但是我使用sqlyog,並且gui由於某種原因沒有顯示它。 但是當我插入recod與不存在的leerplan_id我得到錯誤告訴我,fk_leerp_oefenr_leerplan失敗(=證明它是在位)。 – Bramjam 2010-05-11 19:35:52