2012-01-14 34 views
0

我有一個表模塊,我想強制執行下面的邏輯,但我不確定最好的方法。我正在考慮添加更新和插入觸發器,但遇到觸發器代碼問題。在MySQL中維護列關係

如果module_sub_id大於零,則檢查module_sub_id是否存在爲module_id。如果ZERO則將該行視爲父記錄。

我試圖做的想法是有一個父記錄,它可以有子記錄,而不需要另外一個具有外鍵關係的表。

CREATE TABLE `jlimited_test2`.`modules` (
    `module_id` int(11) NOT NULL AUTO_INCREMENT 
    , `module_sub_id` int(11) NOT NULL default '0' 
    , `module_name` varchar(100) CHARACTER SET utf8 NOT NULL 
    , `module_active` int(11) NOT NULL 
    , PRIMARY KEY (`module_id`) 
) ENGINE = MYISAM DEFAULT CHARSET = latin1; 

這是我的觸發器的代碼。

CREATE TRIGGER myTrigger 
BEFORE INSERT ON modules 
FOR EACH ROW 
BEGIN 
    IF NEW.module_sub_id > 0 THEN 
     IF NOT (
       SELECT count(*) 
       FROM modules 
       WHERE module_id = NEW.module_sub_id 
      ) = 1 THEN 
     INSERT ignore() 
     END IF; 
    END IF; 
END$$ 
+1

沒有什麼大不了的 - 但是你可以用一些換行符來設置你的代碼的格式,使它更具可讀性。 – 2012-01-14 04:00:44

+2

你爲什麼故意讓自己難過?如果是1:N單向關係,則可以創建一個引用「父」列的新列,或者創建一個新表並使用它。沒有可預見的理由,你故意讓自己難過。 – jmkeyes 2012-01-14 04:03:15

+0

層次結構是否應該有最大深度2,或孩子們自己是否有孩子? – outis 2012-01-14 10:35:03

回答

0
更容易

是使module_sub_id一個foreign key引用module_id,並使用NULL,而不是0,沒有父母的記錄(這是NULL是有什麼,畢竟)。外鍵可以引用同一個表。您需要使用InnoDB表格來申請外鍵。

CREATE TABLE `jlimited_test2`.`modules` (
    `module_id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT 
    , `module_sub_id` int(11) UNSIGNED 
    , `module_name` varchar(100) CHARACTER SET utf8 NOT NULL 
    , `module_active` int(11) NOT NULL 
    , PRIMARY KEY (`module_id`) 
    , FOREIGN KEY (`module_sub_id`) REFERENCES `modules` (`module_id`) 
     ON DELETE SET NULL 
     ON UPDATE CASCADE 
) ENGINE = InnoDB DEFAULT CHARSET = latin1;