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する外部キーを作成し、親のないレコードには 0 ではなく NULL を使用する方が簡単module_idです (結局のところ、これが 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 に答える