【问题标题】:Maintain column relationships in MySQL在 MySQL 中维护列关系
【发布时间】: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


【解决方案1】:

更简单的方法是让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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多