MySQL 使用内部连接触发

MySQL Trigger with a Inner Join

我在 mySQL 中有两个 table,称它们为评论和产品。然后我有另一个 table(称之为 productsmaster),它是评论和产品的内部连接。当新记录添加到评论时,我正在尝试为 运行 内部联接查询创建一个触发器。

我试图将内部联接查询插入到触发器中,但它返回“#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;$$

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

杰克

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

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


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

插入第二行时,触发器将尝试(再次)创建完全相同名称的 table(这将失败,因为该名称的 table 已经存在。 )

把车往后倒一点,在马的后面。

并弄清楚你需要满足什么要求。

当你回到需要触发器的时候,你可以在到达它的时候烧掉那个桥。

跟进

如果意图是尝试将行插入 productsmaster table,每当将行插入 reviews table 时,使用插入后触发器,我们需要在触发器主体中添加一个 INSERT 语句。

该行的列值(刚刚插入到 reviews)在触发器中可用。没必要从 reviews table select。我们可以通过使用 NEW.

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

我建议避免使用 .*,并明确命名要从 products 中检索的列。我假设 pid 列是 products.

中的唯一键(或主键)

举个例子:

 DELIMITER $$

 CREATE TRIGGER trg_reviews_after_insert 
 AFTER INSERT ON reviews
 FOR EACH ROW
 BEGIN
    INSERT INTO productsmaster (col1, col2, userid, usergender, userage, score)
    SELECT p.col1
         , p.col2
         , NEW.userid
         , NEW.usergender
         , NEW.userage
         , NEW.score
      FROM products p
      WHERE p.pid = NEW.pid;
  END$$

 DELIMITER $$

从不在触发器中使用 select,触发器只接受更新或插入或删除