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使用多表语法通过单个命令从多个表中删除:

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 回答