0
SET GLOBAL event_scheduler = ON;

CREATE TABLE question(
    qid INT AUTO_INCREMENT PRIMARY KEY,
    name CHAR(30) NOT NULL,
    text CHAR(100) NOT NULL,
    variation BOOLEAN NOT NULL,
    url CHAR(100) NOT NULL UNIQUE,
    expired TIMESTAMP NOT NULL
);

CREATE TABLE alternativ(
    aid INT AUTO_INCREMENT PRIMARY KEY,
    name CHAR(30) NOT NULL,
    text CHAR(50) NOT NULL,
    number_chosen INT,
    qid INT NOT NULL
);

ALTER TABLE alternativ
    ADD FOREIGN KEY (qid)
    REFERENCES question(qid);

CREATE EVENT delete_expired
    ON SCHEDULE
    EVERY 1 DAY
    DO
    DELETE FROM alternativ WHERE alternativ.qid IN (SELECT qid FROM question WHERE question.expired<CURRENT_TIMESTAMP)
    DELETE FROM question WHERE question.expired < CURRENT_TIMESTAMP;

私の質問は: このイベントは指定されたデータベースで機能する必要がありますか? 試してみましたが、うまくいかないようです。アイデアは、データベース自体が期限切れの質問を削除するというものです。助けていただければ幸いです。

4

1 に答える 1

0

イベント本文内で複数のステートメントを指定する場合は、次のような複合ステートメント ブロック内でそれらをラップする必要がありますBEGIN ... END(このようなコマンドを機能させるには、別のステートメント区切り文字を使用するようにクライアントを構成する必要があります。は、最初に検出されたセミコロンがCREATE EVENTステートメントを終了するとは考えていません — mysql コマンドライン ツールでは、次のDELIMITERコマンドを使用できます):

DELIMITER ;;

CREATE EVENT ... DO BEGIN
  DELETE  ... ;
  DELETE  ... ;
END ;;

DELIMITER ;

つまりDELETE、multiple-table 構文を使用して、1 つのコマンドで複数のテーブルから削除できます。

DELETE alternativ, question
FROM   alternativ JOIN question USING (qid)
WHERE  question.expired < CURRENT_TIMESTAMP

ただし、そうは言っても、レコードの削除をカスケードする外部キー制約を指定する方がうまくいくかもしれません。

FOREIGN KEY (qid) REFERENCES question(qid) ON DELETE CASCADE

次に、参照されたレコード (つまり、テーブル内) のみが必要DELETEになりquestion、MySQL が参照レコード (つまり、alternativテーブル内) を削除します。

于 2013-01-22T12:58:19.390 に答える