维护MySQL中的列关系

时间:2012-01-14 03:57:55

标签: mysql sql event-triggers

我有一个名为modules的表,我想强制执行以下逻辑,但我不确定最好的方法。我在考虑添加更新和插入触发器,但是触发器代码存在问题。

如果module_sub_id大于ZERO,则检查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 个答案:

答案 0 :(得分: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;