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,触发器只接受更新或插入或删除
我在 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,触发器只接受更新或插入或删除