Поддерживать отношения столбцов в MySQL - PullRequest
0 голосов
/ 14 января 2012

У меня есть таблица модулей, и я хочу применить следующую логику, но я не уверен, что это лучший способ сделать это. Я думал о добавлении триггера обновления и вставки, но у меня возникли проблемы с кодом триггера.

Если 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 Ответ

0 голосов
/ 14 января 2012

Проще было бы сделать 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...