【问题标题】:MySQL Trigger not working very wellMySQL 触发器不能很好地工作
【发布时间】:2011-12-02 05:56:03
【问题描述】:

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

等式:选择返回类似: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;//

【问题讨论】:

  • 不要使用隐式 SQL '89 连接语法,这是一种反模式,请改用显式连接语法。
  • 您检查过 @ids..返回的值吗?

标签: mysql wordpress triggers phpmyadmin


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我认为您已经被称为隐式连接语法的反模式所困扰。
    它会导致各种问题。
    使您的联接明确,这样您就不会以交叉联接意大利面结束。

    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 在子选择中来自同一个表。

    但您可以更新表并在子子选择中从同一个表中进行选择。
    原因是sub-sub-select在更新之前被强制运行,而“mere” sub-select可以与更新同时运行,这会导致各种问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      • 2020-08-09
      • 1970-01-01
      • 2016-12-08
      • 2020-11-24
      • 1970-01-01
      相关资源
      最近更新 更多