1

ラウンドとイベントの2つのテーブルがあります。1ラウンドには多くのイベントがあります。

create table round (
    round_id INTEGER AUTO_INCREMENT NOT NULL,
    round_start_date DATETIME NOT NULL,
    round_end_date DATETIME NOT NULL,
    CONSTRAINT round_pk PRIMARY KEY (round_id)
);

create table event (
    event_id INTEGER AUTO_INCREMENT NOT NULL,
    round_id INTEGER NOT NULL,
    event_date DATETIME NOT NULL,
    CONSTRAINT event_pk PRIMARY KEY (event_id),
    CONSTRAINT round_fk FOREIGN KEY (round_id) REFERENCES round (round_id),
);

行がイベントテーブルに挿入されたら、トリガーを使用して、新しく挿入された行のevent_dateフィールドを、ラウンドテーブルの対応するエントリのround_start_dateおよびround_end_dateフィールドと比較します。event_dateがround_start_dateより前の場合、round_start_dateを新しいevent_dateで更新する必要があります。event_dateがround_end_dateの後にある場合、round_end_dateは新しいevent_dateで更新する必要があります。

これが私のきっかけです。それは機能しません、そして私は理由がわかりません。他の誰かがトリガーで日時タイプを使用しようとしたWeb上の場所を見つけることができないため、どこが間違っているかについての参照フレームがありません。

create trigger update_round_date
after insert on event for each row
begin
    declare curSdate datetime;
    declare curEdate datetime;
    set curSdate = (select round_start_date from round where round_id = NEW.round_id);
    set curEdate = (select round_end_date from round where round_id = NEW.round_id);
    if (NEW.event_date < curSdate) then
        update round set round_start_date = NEW.event_date where round_id = NEW.round_id;
    else if (NEW.event_date > curEdate) then
        update round set round_end_date = NEW.event_date where round_id = NEW.round_id;
    end if;
end;

編集:私は単にトリガーを作成することはできません。phpMyAdminから次のエラーが表示されます: "#1064-SQL構文にエラーがあります。MySQLサーバーのバージョンに対応するマニュアルで、4行目の''の近くで使用する正しい構文を確認してください。"

編集2:区切り文字セットで更新

DELIMITER $$
create trigger update_round_date
after insert on event for each row
begin
    declare curSdate datetime;
    declare curEdate datetime;
    set curSdate = (select round_start_date from round where round_id = NEW.round_id);
    set curEdate = (select round_end_date from round where round_id = NEW.round_id);
    if (NEW.event_date < curSdate) then
        update round set round_start_date = NEW.event_date where round_id = NEW.round_id;
    else if (NEW.event_date > curEdate) then
        update round set round_end_date = NEW.event_date where round_id = NEW.round_id;
    end if;
end$$

これにより、次のエラーが返されます。「#1064-SQL構文にエラーがあります。13行目の''の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。」

4

2 に答える 2

1

MySQL はおそらく最初の ';' で停止し、コマンドを次のように解釈します。

create trigger update_round_date 
after insert on event for each row
begin
    declare curSdate datetime;

最初に区切り文字を別のものに設定してから、代わりにその区切り文字で create trigger コマンドを終了する必要があります (そして区切り文字を最後に戻します)。

delimiter ^

create trigger update_round_date 
after insert on event for each row
begin
    ...
end;

^

delimiter ;

最後のセミコロンendが必要かもしれないと思います。

于 2012-09-26T06:18:05.373 に答える
1

phpmyadmin の区切り文字に問題がある可能性があります。このトリガーを使用してみてください -

CREATE TRIGGER trigger1
AFTER INSERT
ON event
FOR EACH ROW
  UPDATE
    round
  SET
    round_start_date =
      IF(NEW.event_date < round_start_date, NEW.event_date, round_start_date),
    round_end_date =
      IF(NEW.event_date > round_end_date, NEW.event_date, round_end_date)
  WHERE
    round_id = NEW.round_id;
于 2012-09-26T06:15:15.040 に答える