0

このテーブルのトリガーを作成しようとしているすべての人にこんにちは:

create table Episode(
  title varchar(25) not null,
number int not null,
  length time not null,
  aired date not null,
  serie_name varchar(25),
PRIMARY KEY(title,number),
  FOREIGN KEY (serie_name)REFERENCES Serie(name)
  ) ENGINE=InnoDB;

これは、いくつかのテレビシリーズを保存するデータベースのテーブルです...したがって、トリガーは、前のエピソードの前に放映された新しいエピソードを挿入しようとしているかどうかを確認する必要があります....しかし、解決策に問題がありますか? 私はこれを試しました:

create trigger ControlDataEp
 before insert on Episode
 for each row
begin
if new.aired<(select aired from Episode where title=new.title and number=new.number-1)
    then raise.application_error(-21,'error');
end if;

終わり;

4

2 に答える 2

0

もし私があなただったら、必要がないときはトリガーを使いません。

使用できます

詳細については、リンクしたそれぞれのマニュアル ページを参照してください。

説明するには、ソリューションが機能しない理由:

if new.aired<(select aired 

サブクエリは複数の行を返す場合があります。SELECT MAX(aired) ...代わりに使用してください。

... and number=new.number-1)

データベース内のデータが正常であることを確認するために、データベース外のコードに頼るのはお勧めできません。

then raise.application_error(-21,'error');

raise.application_error()は MySQL 組み込み関数ではありません。このように、MySQL のコードから関数を呼び出すことはできません。本当に MySQLでエラーを発生させたい場合は、SIGNALを使用します。

于 2013-06-05T03:12:33.003 に答える
0

意味のあるエラー メッセージを返すことをあまり気にしない場合は、トリガーを 1 つのステートメントに単純化できます。

CREATE TRIGGER ControlDataEp
BEFORE INSERT ON Episode
FOR EACH ROW
SET NEW.aired = 
(
  SELECT IF(IFNULL(MAX(aired), 0) < NEW.aired, NEW.aired, NULL)
    FROM Episode 
   WHERE title = NEW.title 
     AND number = NEW.number - 1
);

NOT NULL列の制約に違反していairedます。

これがSQLFiddle のデモです。最後の挿入ステートメントのコメントを外します

カスタムエラーメッセージを返す必要がある場合:

  1. 使用できますSIGNALが、MySql 5.5 以降を使用している場合に限ります
  2. ハック的な方法の 1 つを使用します (たとえば、INSERT を失敗させる TRIGGER を読んでください? 可能性がありますか?MySQL トリガーでエラーをスローします) 。
于 2013-06-05T03:35:15.970 に答える