【发布时间】:2012-01-14 03:57:55
【问题描述】:
我有一个名为 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$$
【问题讨论】:
-
没什么大不了的——但是你能不能用一些换行符来格式化你的代码以使其更具可读性。
-
你为什么要故意为难自己?如果它是 1:N 单向关系,要么创建一个引用“父”列的新列,要么只创建一个新表并使用它。你故意让自己无缘无故地让事情变得困难。
-
层次结构的最大深度是否应该为 2,或者孩子们自己可以有孩子吗?
-
在所有 column names 上加前缀
module_是多余的。 -
@JoshuaK:我相信
module_sub_id应该是父级(因为“0”值表示该行没有父级),它只是命名不佳。
标签: mysql sql event-triggers