2013-09-30 28 views
2

我在刪除某些行和關係時清理我的數據庫時出現問題。試圖將外鍵與觸發器結合起來

CREATE TABLE IF NOT EXISTS `cms_users` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `first_name` varchar(50) DEFAULT NULL, 
    `last_name` varchar(50) DEFAULT NULL, 
    `id_account_type` smallint(2) unsigned NOT NULL, 
    PRIMARY KEY (`id`) 
); 

以上是一些用戶。還有那些用戶的孩子,他們都存儲在其他表:

CREATE TABLE IF NOT EXISTS `cms_users_relations` (
    `id_user` int(10) unsigned NOT NULL, 
    `id_parent` int(10) unsigned DEFAULT NULL, 
    UNIQUE KEY `id_user` (`id_user`), 
    KEY `constraint_9` (`id_parent`) 
); 


ALTER TABLE `cms_users_relations` 
    ADD CONSTRAINT `constraint_8` FOREIGN KEY (`id_user`) REFERENCES `cms_users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, 
    ADD CONSTRAINT `constraint_9` FOREIGN KEY (`id_parent`) REFERENCES `cms_users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; 

的問題是,當我從cms_users刪除父所有的孩子也應該被刪除,但他們沒有。我創建了一個TRIGER用於此目的,但不這樣做的工作:

DELIMITER // 
CREATE TRIGGER `delete_user` AFTER DELETE ON `cms_users_relations` 
FOR EACH ROW BEGIN 
    DELETE FROM cms_users WHERE OLD.id_user = cms_users.id; 
END 
// 
DELIMITER ; 

它看起來像MySQL服務器不要打擾我們刪除的用戶,然後刪除外鍵關係,那麼,我們應該把觸發器...

任何想法?

+0

*** SQL ***只是*結構化查詢語言* - 許多數據庫系統使用的語言,但不是數據庫產品......很多東西都是特定於供應商的 - 所以我們真的需要知道什麼* *您正在使用的數據庫系統**(以及哪個版本)(請相應地更新標籤).... –

+0

我同意,我知道但我忘了指定。 –

回答

0

觸發應該cms_users表中創建,而不是在cms_users_relations然後刪除cms_users_relations,如下所示:

DELIMITER // 
CREATE TRIGGER `delete_user` AFTER DELETE ON `cms_users` 
FOR EACH ROW BEGIN 
    DELETE FROM cms_users_relations WHERE OLD.id_user = cms_users_relations.id; 
END 
// 
DELIMITER ; 

trigger是刪除您在cms_users父的,所以這是你想創建它。


我只能看着您是如何創建觸發器,但錯過了,你做的部分:

ALTER TABLE `cms_users_relations` 
    ADD CONSTRAINT `constraint_8` FOREIGN KEY (`id_user`) REFERENCES `cms_users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, 
    ADD CONSTRAINT `constraint_9` FOREIGN KEY (`id_parent`) REFERENCES `cms_users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; 

利用這一點,你不應該需要創建一個觸發器來刪除cms_users元素關係。

看到this fiddle看到它的工作。

你可能想看看at the answers on this question看看你可能有什麼不同,這不工作。

+0

我已經添加了觸發器,檢查我的引擎是否設置爲MyISAM,但仍然不工作:(當我刪除父,孩子仍然存在... –

+1

@PAM。從我連接的問題,我認爲你應該有引擎InnoDB,而不是MyISAM的工作 –

+0

當然,我有ENGINE = InnoDB DEFAULT CHARSET = utf8。對不起,這是一個錯誤。MyISAM不支持外鍵 –

相關問題