我有一个名为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$$
答案 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;