在MySQL中维护列关系

在MySQL中维护列关系,mysql,sql,event-triggers,Mysql,Sql,Event Triggers,我有一个名为modules的表,我想强制执行以下逻辑,但我不确定最好的方法。我在考虑添加一个更新和插入触发器,但触发器代码有问题 如果模子子ID大于0,则检查模块MuleSuiID是否存在作为模块ID。如果为0,则考虑行为父记录。 我想做的是有一个父记录,它可以有子记录,而不需要另一个表,它们之间有外键关系 CREATE TABLE `jlimited_test2`.`modules` ( `module_id` int( 11 ) NOT NULL AUTO_INCREMENT ,

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

如果模子子ID大于0,则检查模块MuleSuiID是否存在作为模块ID。如果为0,则考虑行为父记录。

我想做的是有一个父记录,它可以有子记录,而不需要另一个表,它们之间有外键关系

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$$

更容易的方法是将
module\u sub\u id
设为引用
module\u 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;

没什么大不了的-但是你能用一些换行符来格式化你的代码,使它更可读。你为什么故意让事情变得困难?如果是1:N单向关系,请创建一个引用“父”列的新列,或者创建一个新表并使用它。你故意把事情搞得一团糟,没有任何可预见的原因。层次结构的最大深度应该是2,还是孩子们自己可以有孩子?在all上加前缀
module\u
是多余的。@JoshuaK:我相信
module\u sub\u id
应该是父级(作为“0”的值)表示该行没有父行),只是名称不正确。