【问题标题】:MySQL Trigger - Compare Values of two different tablesMySQL 触发器 - 比较两个不同表的值
【发布时间】:2019-04-24 02:33:22
【问题描述】:

我目前正在努力在 MySQL 中实现触发器。 我的情况如下:

有两个数据库(emailregistration & answers)以不同的 id 作为主键。因此,我想使用电子邮件地址作为标识符来识别需要更新的正确行。(在两个表中都是相同的) 我想在数据库“注册”更新时启动触发器。然后,此触发器会更新“用户”中的值。 (表示为确认/取消订阅

据我了解,问题是没有检查正确的行。我下面的代码直接来自 phpmyadmin。在其当前形式中,该语句用空行填充答案数据库,并根据需要更改确认/取消订阅的列,但它没有识别正确的行。

    AFTER
    UPDATE
    ------
    INSERT INTO answers (confirmed, unsubscribed)
    SELECT emailregistration.confirmed, emailregistration.unsubscribed
    FROM emailregistration
    WHERE emailregistration.email = email
    -----
    root@localhost

    *This should translate into the following trigger code:*

    CREATE TRIGGER DOI 
    AFTER UPDATE
    ON emailregistration
    FOR EACH ROW
    BEGIN
    INSERT INTO answers (confirmed, unsubscribed)
    SELECT emailregistration.confirmed, emailregistration.unsubscribed
    FROM emailregistration
    WHERE emailregistration.email = email
    END;

我希望我准确地描述了我的问题。如果我没有,请随时提出问题。 感谢您的帮助,非常感谢。

【问题讨论】:

  • 在触发器中,我希望看到对 OLD 的引用。和/或新的。值(取决于触发器类型)“在触发器主体中,OLD 和 NEW 关键字使您能够访问受触发器影响的行中的列。” dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html
  • 请添加其余的触发代码。
  • @P.Salmon 添加了触发代码,我刚刚阅读了文档的这个页面。据我了解,这仅在引用更新的单元格时才有帮助。如何继续比较 emailregistration 中的“email”列与答案中的“email”列,以确保它解决了正确的列?感谢您的帮助!
  • 我对这个问题感到困惑。你说你'这个触发器然后更新“用户”中的一个值。 ' 但触发器中没有用户表,此外,您还插入了未更新的答案,这与您声明的要求不一致。并且查询模糊=符号右侧的电子邮件列属于哪个表?实际上每封电子邮件的答案表中只有 1 条记录吗?
  • 嗯,也许我解释它真的很复杂。 “registration”表具有以下 3 列(email、subscribed、confirmed),“users”表具有相同的 3 列。现在我想比较两个数据库中 email 列的值,并将注册的确认和取消订阅的值分配给用户中的列。那有意义吗?左边的表格属于“答案”。这就是它变得更加复杂的地方,从技术上讲,它可能不止一次。

标签: mysql triggers phpmyadmin


【解决方案1】:

可能是这样的

drop table if exists r,u;
create table r(email varchar(3), subscribed varchar(1), confirmed varchar(1));
create table u(email varchar(3), subscribed varchar(1), confirmed varchar(1));

insert into r (email) values('aaa'),('bbb');
insert into u (email,subscribed,confirmed) values('aaa','x','x'),('bbb','y','y');
drop trigger if exists t;
delimiter $$
CREATE TRIGGER t 
AFTER UPDATE
ON r
FOR EACH ROW
BEGIN
     update u 
        set  subscribed = new.subscribed,
              confirmed = new.confirmed
        where email = new.email;

END $$
delimiter ;

update r set subscribed = 'n' where email = 'aaa';

select * from r;

+-------+------------+-----------+
| email | subscribed | confirmed |
+-------+------------+-----------+
| aaa   | n          | NULL      |
| bbb   | NULL       | NULL      |
+-------+------------+-----------+
2 rows in set (0.00 sec)

select * from u;

+-------+------------+-----------+
| email | subscribed | confirmed |
+-------+------------+-----------+
| aaa   | n          | NULL      |
| bbb   | y          | y         |
+-------+------------+-----------+
2 rows in set (0.00 sec)

如果这不是您拥有的模型,则将其与预期结果一起添加到问题中。

【讨论】:

  • 非常感谢您提供这个,我明天测试一下!
猜你喜欢
  • 2021-10-05
  • 2021-06-19
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
  • 1970-01-01
相关资源
最近更新 更多