2011-10-06 75 views
2

我正在使用wordpress,並且需要創建一個觸發器,在另一個更新時更新表。我創建了觸發器,她在理論上工作,但它只更新第一條記錄並暫停執行。用於存儲返回的select的變量將是以逗號分隔的id之一。MySQL觸發器不能很好地工作

式:該選擇回報是這樣的:424532123212

而且通過把「中」的更新中使用它。

UPDATE wp_posts SET e.post_modified = date (NEW.modified_date) e.ID WHERE IN (@ids); 

正如我說在這種情況下,僅更新的第一個記錄是424

我希望有人能幫助我。

這裏是觸發:

CREATE TRIGGER triggerupdatedata AFTER UPDATE ON wp_ngg_gallery 
FOR EACH ROW BEGIN 


    set @ids := (SELECT 
     GROUP_CONCAT(a.ID SEPARATOR ',') 
    FROM 
     wp_posts a, wp_postmeta b, wp_ngg_gallery c 
    WHERE 
     c.gid = OLD.gid 
    AND 
     a.ID = b.post_id 
    AND 
     b.meta_key = 'galeria_id' 
    AND 
     c.gid = (SELECT d.meta_value FROM wp_postmeta d WHERE d.post_id = a.ID AND d.meta_key = 'galeria_id') 
    ); 

UPDATE wp_posts e SET e.post_modified = date(NEW.modified_date) WHERE e.ID IN (@ids); 

END;// 
+0

不要使用隱式SQL '89連接語法它是反模式,而是使用顯式連接語法。 – Johan

+0

您是否檢查了** @ids **返回的值? – Chandresh

回答

1

我想你已經被稱爲隱式連接語法的反模式咬了。
它會導致各種問題。
使你的連接明確,所以你不會結束交叉連接spaggeti。

另外,SQL和CSV不能混用。

CREATE TRIGGER au_wp_ngg_gallery_each AFTER UPDATE ON wp_ngg_gallery FOR EACH ROW 
BEGIN 
    UPDATE wp_posts e SET e.post_modified = date(NEW.modified_date) WHERE e.ID IN (
    SELECT * FROM (
    SELECT a.id 
    FROM wp_posts p 
    INNER JOIN wp_postmeta pm ON (pm.post_id = p.id AND pm.meta_key = 'galeria_id') 
    INNER JOIN wp_postmeta pm2 ON (pm2.post_id = p.id AND pm2.meta_key = 'galeria_id') 
    /* not sure if the join on pm2 is needed or not */ 
    INNER JOIN wp_ngg_gallery ng ON (ng.gid = pm2.meta_value) 
    WHERE 
     ng.gid = OLD.gid) sub) subsubhack); 
END // 

你不能update從子查詢中同表的表和select

但是你可以更新表和子子選擇從同一個表中選擇。
原因是在更新之前,子子選擇被強制運行,而「僅僅」子選擇可以與更新同時運行,這會導致各種問題。

+0

非常感謝!它只是工作! ; d –

1

ID值不保存到一個變量。在UPDATE查詢中直接使用子查詢。另外,像約翰說的 - 不使用隱式連接語法。