如何使用触发器更新MySQL中的不同表?

如何使用触发器更新MySQL中的不同表?,mysql,triggers,sql-update,Mysql,Triggers,Sql Update,我有两个MySQL表。投票表(id,userId,posted,voteTypeId),以及posts表(id,postTypeId,userId,parentId)表。我正在写一个触发器,在插入投票后触发 我希望触发器更新posts表中的post。但这篇文章与我的投票表中的postId下引用的文章不同;它是那篇文章的作者 BEGIN CASE NEW.voteTypeId WHEN 2 THEN UPDATE posts SET posts.acceptedAnswerId = NEW

我有两个MySQL表。投票表
(id,userId,posted,voteTypeId)
,以及posts表
(id,postTypeId,userId,parentId)
表。我正在写一个触发器,在插入投票后触发

我希望触发器更新posts表中的post。但这篇文章与我的投票表中的
postId
下引用的文章不同;它是那篇文章的作者

BEGIN
CASE NEW.voteTypeId
    WHEN 2 THEN UPDATE posts SET posts.acceptedAnswerId = NEW.postId WHERE posts.id = @the parent postId of NEW.postId
    ELSE
        BEGIN
        END;
    END CASE;
END
我试着用这个来代替“的父母”:

(SELECT posts.parentId FROM posts WHERE posts.id = NEW.postId)
但是我不认为你可以在触发器中做选择,除非你在语法中使用某种类型的选择。我要更新的对父帖子的唯一引用是其子帖子的引用。因此,我不知道如何在不通过select获取正确id的情况下进行更新

这可能吗?

我会这样做:

BEGIN
  IF (NEW.voteTypeId = 2) THEN
    UPDATE
      posts AS p
    CROSS JOIN
      posts AS p2
    ON
      p.id = p2.parentId
    SET
     p.acceptedAnswerId = NEW.postId
    WHERE
     p2.id = NEW.postId;
  END IF;
END

实际上,您可以在触发器中进行选择。不过,您的其他语法看起来有点不正确。@Mchl,我尝试了一些组合,但没有成功。你能指出我做错了什么吗?谢谢你。我可以问你为什么用交叉连接吗?为什么不只是一个带别名的普通连接呢?在MySQL中,
内部连接
交叉连接
连接
都是等效的。实际上,根据ANSI SQL规范,我应该在这里使用
内部联接
(因为我在联接条件上使用了
,而不是
使用()。从功能上看,它没有什么区别,但可能会提高可移植性。