0

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

如果 module_sub_id 大于零,则检查 module_sub_id 是否作为 module_id 存在。如果为零,则将该行视为父记录。

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

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

1 回答 1

0

更容易的是创建module_sub_id一个外键引用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;
于 2012-01-14T10:33:29.073 回答