【问题标题】:MySQL trigger and conditional updateMySQL 触发器和条件更新
【发布时间】:2017-08-11 02:12:20
【问题描述】:

我想在INSERT 上创建一个 MySQL 触发器:当在wp_posts 表中插入新记录时,我想更新wp_posts.post_author 从其他两个表中检索数据,使用两个子查询(我想这个可以做得更好)。

无论如何,更新应该是“有条件的”,即只有当wp_posts.post_title 的值为“A”、“B”或“C”时才必须更新行。这可能吗?

这是我尝试过的:

CREATE TRIGGER updatePostIDonInsert
AFTER INSERT
   ON wp_posts FOR EACH ROW

BEGIN

   -- variable declarations

   -- trigger code
// ? (pseudo: if wp_posts.post_title IN ("A","B","C") then...)

UPDATE wp_posts SET post_author = 
(SELECT ID from wp_users WHERE user_email = 
(SELECT meta_value FROM `wp_postmeta` WHERE post_id = wp_posts.ID AND meta_key = "_from_email"))

END;

感谢任何帮助

[UPDATE] 我尝试的最新查询:

CREATE TRIGGER updatePostIDonInsert
    BEFORE INSERT
       ON wp_posts FOR EACH ROW
    BEGIN

    IF FIND_IN_SET(NEW.post_title,'General contact,Website contact,Master contact') > 0 AND NEW.post_type ='inbound_com' THEN
    SET NEW.post_author = (SELECT ID from wp_users WHERE user_email = (SELECT meta_value FROM wp_postmeta WHERE post_id = NEW.ID AND meta_key = '_from_email'));

    END IF;

    END;

(如果通过 PhpMyAdmin 触发器部分插入,但没有最终的 END 并从 IF 开始,则此方法有效)

【问题讨论】:

  • 我不认为你可以更新正在执行插入触发器的同一个表,你可以做的是拥有 BEFORE INSERT TRIGGER 并修改 post_author 的值,以便将修改后的值一起插入与您的插入查询的其他值。 SET NEW.post_author = 如果值来自子查询,则应返回单个记录。
  • 好的,感谢您指出这一点(我对触发器很陌生,我通常不使用 dbs)
  • 请注意,如果您想访问将插入的 valueof 字段,您需要使用 NEW 关键字。即 IF FIND_IN_SET(NEW.post_title,'A,B,C,D') > 0 THEN。改用FIND_IN_SET 函数
  • @Learning 你为什么不发布触发器的整个代码?也就是说,我感谢您的 cmets,但我也可以接受您的回答 :-)
  • 我忘了说 post_type (另一列)必须包含某个值,但我想我可以使用 FIND_IN_SET 两次

标签: mysql triggers


【解决方案1】:

类似的东西。而不是触发 AFTER INSERT 利用 BEFORE INSERT TRIGGER

    CREATE TRIGGER updatePostIDonInsert
    BEFORE INSERT
       ON wp_posts FOR EACH ROW
    BEGIN
        // add this condition    
    IF FIND_IN_SET(NEW.post_title,'A,B,C') > 0 THEN

            -- variable declarations

            -- trigger code
            SET NEW.post_author = (SELECT ID from wp_users WHERE user_email =
(SELECT meta_value FROM `wp_postmeta` WHERE post_id = NEW.ID AND meta_key = "_from_email") LIMIT 1);
        END IF;

    END;

您需要确保在子查询中只返回单行。我不熟悉您的数据库结构,所以我无法真正告诉您如何优化您的 post_author 的子查询。

剩下的就看你自己了。您可以在需要时使用 FIND_IN_SET。

【讨论】:

  • #1064 - 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 7 行的 '' 附近使用正确的语法(该行是我们设置 NEW.post_author = ... 的位置)
  • 如果我将 " 替换为 ',我会得到:"#1064 - 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,了解在第 8 行的“END IF”附近使用的正确语法”
  • wp_posts.ID 不应该是 NEW.ID 吗? (只是问)
  • 是的,应该是 NEW.ID
  • 我实际上并不熟悉 MarianD,但我确实尝试在第一个右括号之后使用 LIMIT 1 模拟您的 select 语句,它似乎工作正常。 SET @a = (SELECT ID FROM mytable WHERE email = (SELECT emailadd FROM emailaddress WHERE id=1) LIMIT 1);
【解决方案2】:

这是你需要的吗?

这里的触发器只有在新插入的 post_title 位于 ("A","B","C") 时才会执行操作

CREATE TRIGGER updatePostIDonInsert
AFTER INSERT
   ON wp_posts FOR EACH ROW
BEGIN
    // add this condition
    IF (NEW.post_title IN ("A","B","C")) THEN

        -- variable declarations

        -- trigger code
        // ? (pseudo: if wp_posts.post_title IN ("A","B","C") then...)

        UPDATE wp_posts SET post_author = 
        (SELECT ID from wp_users WHERE user_email = 
        (SELECT meta_value FROM `wp_postmeta` WHERE post_id = wp_posts.ID AND meta_key = "_from_email"))
    END IF;

END;

【讨论】:

  • 问题是您似乎无法在插入后更新同一个表。通过上面的学习查看评论
猜你喜欢
  • 1970-01-01
  • 2012-10-06
  • 1970-01-01
  • 1970-01-01
  • 2015-01-17
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
相关资源
最近更新 更多