5

テーブルがありSCHEDULES_CLASS、そのフィールドの 2 つはCLASS_ID(CLASS テーブルからの外部キー)、STATUSおよびNUMBER_OF_ENROLLED_STUDENTSです。CLASSMAX_SEATS として 1 つのフィールドを持つ他のテーブルがあります。

NUMBER_OF_ENROLLED_STUDENTS予定されたクラスの がそれぞれのクラスの利用可能と等しい場合、そのステータスを初期ステータスの「OPEN」から「FULL」MAX_SEATSに変更する必要があります。SCHEDULES_CLASS

この目的のために、次のようにトリガーを作成しました。

USE mydb;
DELIMITER ##
dROP TRIGGER IF EXISTS updateClassStatusTrigger ##
CREATE TRIGGER updateClassStatusTrigger
BEFORE UPDATE ON SCHEDULED_CLASS
  FOR EACH ROW
  BEGIN
        UPDATE SCHEDULED_CLASS SET STATUS="FULL" WHERE CLASS_ID=NEW.CLASS_ID
        AND EXISTS (SELECT 1 FROM SCHEDULED_CLASS sc, CLASS cl WHERE cl.CLASS_ID=NEW.CLASS_ID AND NEW.NUMBER_OF_ENROLLED_STUDENTS=cl.MAX_SEATS);
END##

phpmyadmin を使用していますが、SCHEDULED_CLASS テーブルで更新が行われると、次のエラーが発生します。

#1442 - Can't update table 'SCHEDULED_CLASS' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 

このタスクを達成する方法はありますか? つまり、登録済みの学生数が利用可能な最大席数に達するたびに、スケジュールされたクラスのステータスを「FULL」に更新します。

ありがとう

4

1 に答える 1

9

同じ行を更新する方法は単純SET NEW.column_name = some_Valueです。トリガーを単純化するには、次のことを考慮してください。

CREATE TRIGGER updateClassStatusTrigger
BEFORE UPDATE ON SCHEDULED_CLASS
FOR EACH ROW
  SET NEW.STATUS='FULL'

さらに、特定の条件を指定して値を更新するだけで済みます。標準を使用しなくなったため、同じクエリ内でこれを行うことはできませんUPDATE。だから、分割:

USE mydb;
DELIMITER ##
dROP TRIGGER IF EXISTS updateClassStatusTrigger ##
CREATE TRIGGER updateClassStatusTrigger
BEFORE UPDATE ON SCHEDULED_CLASS
  FOR EACH ROW
  BEGIN
        SELECT EXISTS (SELECT 1 FROM SCHEDULED_CLASS sc, CLASS cl WHERE cl.CLASS_ID=NEW.CLASS_ID AND NEW.NUMBER_OF_ENROLLED_STUDENTS=cl.MAX_SEATS) INTO @row_exists;
        IF @row_exists THEN
          SET NEW.STATUS='FULL';
        END IF;
  END##

上記に構文エラーがないことを願っています。私は自分のテーブルでテストしましたが、スキーマに合うように編集しました。

トリガー内から、MySQL はトリガーが実行されたテーブルを変更することを許可していないため、あなた自身の試みは失敗しました。クエリを分析して、本質的に試行したことが有効な方法で達成できるかどうかを判断できませんでした。試行さえしません。同じテーブルの変更を禁止するだけです。

于 2012-07-14T12:13:26.943 に答える