MySQL Trigger工作得不好

时间:2011-10-06 13:12:14

标签: mysql wordpress triggers phpmyadmin

我正在使用wordpress,需要创建一个触发器,在更新另一个表时更新表。我创建了触发器,她在理论上工作,但它只更新第一条记录并暂停执行。用于存储返回的选择的变量将是以逗号分隔的ID之一。

Eq:select返回类似于:424,532,123,212

并在更新中使用“in”。

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;//

2 个答案:

答案 0 :(得分:1)

不要将id值保存到变量中。直接在UPDATE查询中使用子查询。 此外,就像约翰所说 - 不要使用隐式连接语法。

答案 1 :(得分: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

可以更新表格,并在子子选择中从同一个表格中选择。
原因是在更新之前强制子子选择运行,而“仅仅”子选择可以与更新同时运行,这将导致各种问题。