2013-01-22 51 views
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; 

我的问题是:该事件是否应该与指定的数据库一起工作?我已经尝试过了,但它似乎没有奏效。这个想法是,数据库本身将删除已过期的问题。非常感谢帮助。需要对MySQL事件发表评论

回答

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表中)。

+0

非常感谢! – user2000316