【问题标题】:How to write a trigger for a table based on the value of a column in another table?如何根据另一个表中列的值为一个表编写触发器?
【发布时间】:2020-11-01 23:34:29
【问题描述】:

我有一个表“A”,其中有一列“标志”,如下所示:

candidate_id | name | flag 
-----------------------------
0001         |  ABC |  f  | 
0002         |  DEF |  t  | 
0003         |  GHI |  t  | 

还有一个表“B”,其中有一列“状态”,如下所示:

candidate_id | status 
-----------------------------
0001         |  Applied  |
0002         |  Applied  |
0003         |  Applied  |

我想用以下逻辑写一个触发器:

  • 当表“B”中出现条目时,我想将“状态”值更改为“拒绝”,仅当表“B”中最后插入的“candidate_id”引用表“A”中的“candidate_id”时, 有一个“flag=t”。

我已经编写了一个触发器,如下所示,但我无法在 MySql 中找到语法来获取特定候选 ID 的“标志”值:

CREATE TRIGGER update_status_to_rejected
Before INSERT ON db.B FOR EACH ROW  
BEGIN
    DECLARE candidate_id INTEGER;
    candidate_id = NEW.candidate_id;
    // Im stuck from here with the MySQL syntax
    get the last_inserted candidate_id,
    check in table A whether this candidate_id flag=='t'
    then:
        set NEW.status = 'Rejected'

你能在这里指导我吗?我搜索了许多解决方案,但无法找到何时需要检查另一个表的值。我还想知道如何使用 status='Rejected' 插入新行,而不是更新最后插入的行。提前谢谢你。

【问题讨论】:

    标签: mysql database triggers mysql-workbench database-trigger


    【解决方案1】:

    这是我测试过的解决方案:

    CREATE TRIGGER update_status_to_rejected
    Before INSERT ON B FOR EACH ROW
    BEGIN
            DECLARE _flag CHAR(1);
            SELECT flag INTO _flag FROM A WHERE candidate_id = NEW.candidate_id;
            IF _flag = 't' THEN
                    SET NEW.status = 'Rejected';
            ELSE    
                    SET NEW.status = 'Applied';
            END IF; 
    END
    

    测试:

    mysql> insert into B set candidate_id = '0001';
    mysql> insert into B set candidate_id = '0002';
    mysql> insert into B set candidate_id = '0003';
    

    结果:

    mysql> select * from B;
    +--------------+----------+
    | candidate_id | status   |
    +--------------+----------+
    | 0001         | Applied  |
    | 0002         | Rejected |
    | 0003         | Rejected |
    +--------------+----------+
    

    【讨论】:

    • 谢谢@bill。那真的很有帮助。但是工作台向我抛出了如下错误: 1. CHAR(1) - 发现输入意外结束,期待:';' 2.“IF”在该位置没有有效输入,期待:EOF,BACKUP,BEGIN,CACHE... 3.“END”在该位置没有有效输入,期待:EOF,BACKUP,BEGIN,CACHE...有没有我们需要更新的语法?看到多种解决方案后,我被困在这里。
    • 我不知道你输入了什么或者你在 Workbench 中的哪个窗口中进行操作。这是一个关于如何在 Workbench 中创建触发器的视频:youtube.com/watch?v=X8o0gETy-OQ 我只能说我测试了上面的代码,但是我用的是mysql客户端,不是Workbench。我还需要使用 DELIMITER,就像在定义任何存储过程、函数或触发器时一样。如果您使用合适的窗口在 Workbench 中创建触发器,则无需更改分隔符。
    猜你喜欢
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多