2013-01-22 46 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