2012-08-29 78 views
0

我在MySql中遇到TRIGGER問題。基於查詢刪除特定記錄的簡單TRIGGER

notifications_posts 
notification_id from_user on_post_id in_group_id date 
2 1 162 3 2012-07-11 12:01:08 
3 19 163 1 2012-07-11 12:03:26 
4 19 164 1 2012-08-10 17:42:36 
5 1 165 3 2012-08-29 12:14:01 
6 1 165 3 2012-08-29 12:14:29 
11 1 2 3 2012-08-29 14:38:42 

有時我需要刪除的帖子,例如使用下面的命令:

DELETE FROM posts WHERE posts.post_id = 165; 

在這之後,我想的是,根據該ID從notification_id將刪除所有記錄的觸發器。

這是我到目前爲止有:

DELIMITER $$ 
CREATE OR REPLACE TRIGGER CleanNotificationPosts 
AFTER DELETE ON posts 
FOR EACH ROW 
BEGIN 
    DELETE FROM notifications_posts WHERE notifications_posts.id = THAT_ID_TO_DELETE; 
END $$ 
DELIMITER ; 

是我的語法是否正確?我真的需要分隔符嗎?

+0

是否有問題,或者是修改代碼? –

回答

2
  1. 我真的需要分隔符嗎?

    的語法,你現在知道了:是的,你確實需要使用其他分隔符不是默認; —否則CREATE TRIGGER聲明將由;END關鍵字前被終止,這將導致解析錯誤(因爲BEGIN ... END塊不會被終止)。

    然而,由於只有一個塊內聲明,你實際上並不需要使用BEGIN ... END都:

    CREATE OR REPLACE TRIGGER CleanNotificationPosts 
    AFTER DELETE ON posts 
    FOR EACH ROW 
    DELETE FROM notifications_posts WHERE notifications_posts.id = THAT_ID_TO_DELETE; 
    

    在這種情況下,不需要語句分隔符的改變:;是確實在CREATE TRIGGER語句終止的地方。

  2. 我的語法正確嗎?

    差不多,但不完全。您應該使用OLD.post_id而不是THAT_ID_TO_DELETE。正如CREATE TRIGGER Syntax說:

    您可以通過使用別名OLDNEW引用列主題表格(與觸發器關聯的表)。 OLD.col_name在更新或刪除之前引用現有行的列。 NEW.col_name引用要插入的新行的列或更新後的現有行。

    另外,OR REPLACE在MySQL中無效。在執行CREATE TRIGGER語句之前,您可以改爲DROP TRIGGER IF EXISTS

    因此:

    DROP TRIGGER IF EXISTS CleanNotificationPosts; 
    CREATE TRIGGER CleanNotificationPosts 
    AFTER DELETE ON posts 
    FOR EACH ROW 
    DELETE FROM notifications_posts WHERE notifications_posts.id = OLD.post_id; 
    
  3. 然而,在這種情況下,你實際上並不需要使用所有的觸發(如ON DELETE CASCADE一個foreign key constraint就足夠了):

    ALTER TABLE notifications_posts 
        ADD FOREIGN KEY (id) REFERENCES posts (post_id) ON DELETE CASCADE; 
    

    注意遵循先決條件以添加這樣的外鍵約束:

    • 這兩個表都必須使用InnoDB存儲引擎;

    • posts表中必須有一個索引,其中post_id是第一列;和

    • 必須有posts.post_id匹配的記錄的所有非NULLnotifications_posts.id(下降到塔型,包括其大小&符號)。

+0

嘿,非常感謝,但你確定我必須使用'OLD'嗎? '您可以使用別名OLD和NEW來引用主題表中的列(與觸發器關聯的表)。 OLD.col_name在更新或刪除之前引用現有行的列。 NEW.col_name是指要插入的新行的列或其更新後的現有行。' – Empeus

+0

我的意思是在刪除後 – Empeus

+0

或「OLD」指的是「那個ID在過去的一個時間 ..」 ? – Empeus