0

だから私はこのテストを控えており、練習テストを行っていますが、どういうわけかトリガーが機能しません。教えてもらった通りにやったのですが、うまくいきません。誰でも私を助けることができますか?

私はこのテーブルを作成しました:

CREATE TABLE DiscountActions(
discountID int(5) NOT NULL AUTO_INCREMENT,
dishName varchar(70) NOT NULL,
type varchar(70) NOT NULL,
discountPercentage varchar(70) NOT NULL,
startdate date NOT NULL,
enddate date NOT NULL,
PRIMARY KEY (discountID)
);

そして、私はこのトリガーを追加したい:

DELIMITER //
CREATE TRIGGER `checkStartDatum` 
AFTER INSERT ON `DiscountActions`
FOR EACH ROW 
BEGIN 
  IF NEW.startdate < DATE(NOW()) 
     THEN DELETE 
        FROM DiscountActions
        WHERE startdate = NEW.startdate;
  END IF ;
END ; 
//

しかし、追加すると、次のエラーが表示されます。次のエラーが表示されます: #1064 - SQL 構文にエラーがあります。6 行目の 'THEN DELETE FROM kortingactie WHERE begindatum = NEW.b' 付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

これが行うべきことは次のとおりです。新しいDiscountActionを追加するとき、開始日が過去かどうかを確認する必要があります。開始日が過去の場合、割引アクション全体を削除することはできないため、削除する必要があります。

4

1 に答える 1

0

トリガーに構文上の問題はありません。これがそれを示すSQLFiddleです。残念ながら、トリガーは機能しません。条件が満たされるとエラーになります

このストアド関数/トリガーを呼び出したステートメントで既に使用されているため、ストアド関数/トリガーのテーブル 'discountactions' を更新できません。

<現在の日付の場合に行の挿入を防ぐために、次のstartdateことができます。

  1. AFTERトリガーをBEFOREトリガーに変更する
  2. 条件が満たされた場合、既存の制約の 1 つに違反するだけです。startdateあなたのテーブルには制約があるので、それNOT NULLを利用できます。

トリガーの動作バージョンは次のようになります

CREATE TRIGGER checkStartDatum
BEFORE INSERT ON DiscountActions
FOR EACH ROW 
  SET NEW.startdate = IF(NEW.startdate < CURDATE(), NULL, NEW.startdate);

これは 1 ステートメントのトリガーなので、区切り文字を変更する必要さえありません。

これがSQLFiddle のデモです。最後の挿入ステートメントのコメントを外し、トリガーが挿入を許可しないことを確認します。

于 2013-06-13T23:49:22.607 に答える