0

スタッフの削除を防ぐトリガーを作成する必要があります。

4

1 に答える 1

1

トリガードキュメントから:

トリガーは、START TRANSACTION、COMMIT、またはROLLBACKなどのトランザクションを明示的または暗黙的に開始または終了するステートメントを使用できません。

したがって、通常、これは不可能です。トランザクション全体を失敗させたい場合は、トリガーにエラーを強制することができます。

CREATE TRIGGER t1 BEFORE DELETE ON table1
FOR EACH ROW
BEGIN
      IF (failCondition) THEN
           SELECT 1/0 FROM table1 LIMIT 1
      END IF;
END

これによりエラーがトリガーされ、トランザクション全体がロールバックされます

編集:

だからあなたの問題のためにこれはこのようなものになるでしょう

CREATE TRIGGER preventLastStaffDeletion BEFORE DELETE ON Admission
FOR EACH ROW
BEGIN
      DECLARE remaining INT DEFAULT 0;
      SET remaining := (SELECT COUNT(staff) FROM Admission WHERE the_date = OLD.the_date AND work_time = OLD.work_time );
      IF remaining = 1 THEN
           SELECT 1/0 FROM Admission LIMIT 1
      END IF;
END

構文エラーの言い訳はテストしませんでしたが、アイデアは明確である必要があります。

残りが1つになるまで、この日付でこの勤務時間のスタッフを削除できます

編集2 質問を読み直し、失敗条件を更新しました

于 2012-12-04T01:35:03.407 に答える