具有内部联接的MySQL触发器

时间:2015-07-02 14:58:23

标签: mysql join triggers

我在mySQL中有两个表,称之为评论和产品。然后我有另一张桌子(称之为productmaster),这是评论和产品的内在联接。我正在尝试创建一个触发器,以便在将新记录添加到评论时运行内部联接查询。

我试图将内部联接查询插入到触发器中,但它返回“#1422 - 存储函数或触发器中不允许显式或隐式提交”。错误。为了清楚问题,我的触发器代码是:

CREATE TRIGGER updateprodmaster 
AFTER INSERT ON reviews 
FOR EACH ROW 
BEGIN 
CREATE TABLE productsmaster AS
SELECT products.*, reviews.userid, reviews.usergender, reviews.userage, reviews.score
FROM products
INNER JOIN reviews
ON products.pid=reviews.pid;
END;$$

如果有人对此有任何想法,我将不胜感激。谢谢!

杰克

2 个答案:

答案 0 :(得分:4)

CREATE TABLE 语句会导致隐式COMMIT。那是不允许的。

此限制没有简单的按钮解决方法。

但即使你能够解决这个限制,为什么在塑料中你想在每次插入一行时尝试创建一个新表?

当插入第二行时,触发器将尝试(再次)创建一个完全相同名称的表(由于该名称的表已经存在,因此将失败。)

将马车放回马后面。

找出你需要满足的要求。

当您回到需要触发器时,可以在到达时烧掉该桥。

<强>后续

如果目的是尝试在productsmaster表中插入一行,只要在reviews表中插入一行,使用后插入触发器,我们就需要{{{触发器体中的1}}语句。

行的列(刚刚插入INSERT)的值在触发器中可用。无需从reviews表格中进行选择。我们可以通过使用 reviews

限定列名称来引用新插入行的列值(在插入后触发器中)

我建议您避开 NEW. ,并明确指定要从.*检索的列。我假设products列是pid中的唯一键(或主键)。

举个例子:

products

答案 1 :(得分:0)

永远不要在触发器中使用选择,触发器只接受更新或插入或删除