【问题标题】:In a trigger how to insert values into another table but check if values already exists在触发器中如何将值插入另一个表但检查值是否已经存在
【发布时间】:2013-08-12 16:05:23
【问题描述】:

根据我之前的帖子发现 here 当第一个表的状态发生变化时,我能够将值插入到第二个表中,但是它不断添加,我需要检查 submit_id 是否已经插入到第二个表中表然后更新字段而不插入它增益,我将如何在触发器执行之前进行检查? 因为 new.status 和 old.status 指的是正在编辑的行而不是它正在插入的表上的行,我如何比较它并插入或更新,如果它已经存在, 谢谢

【问题讨论】:

    标签: mysql sql triggers


    【解决方案1】:

    您可以为此使用INSERT INTO ... ON DUPLICATE KEY UPDATE 语法

    如果要让它正常工作,您必须在第二个表中的 submitId 列上有一个 UNIQUE 约束(我们称之为 students)。

    ALTER TABLE students ADD UNIQUE (submitId);
    

    现在是触发器的改进版本

    DELIMITER $$
    CREATE TRIGGER tg_au_submissions
    AFTER UPDATE ON submissions
    FOR EACH ROW
    BEGIN
      IF NEW.status = 1 THEN
        INSERT INTO students (submitId, studentName, submitDate, contacts, email) 
        VALUES (NEW.submitId, NEW.studentName, NEW.submitDate, NEW.contacts, NEW.email)
        ON DUPLICATE KEY UPDATE 
          studentName = VALUES(studentName),
          submitDate = VALUES(submitDate),
          contacts = VALUES(contacts),
          email = VALUES(email);
      END IF;
    END$$
    DELIMITER ;
    

    这里是SQLFiddle演示

    【讨论】:

    • 谢谢@peterm,这是缺少的步骤,我没有添加唯一约束,它现在按预期工作。
    • 我还有一个问题,现在看看我正在尝试做什么以及我正在做的事情,我是否以正确的方式做事并正确应用规范化?这是我在 mysql 的第一步,所以我想确保我做对了 :) 谢谢
    • @BobMachine 不幸的是,您的原始问题中没有足够的信息来智能地回答您的这个后续问题。我建议发布另一个问题,将您所有的表架构放在一起,并清楚地解释您要实现的目标,要求是什么。
    • 我在linkhere 和fiddlelink 发布了一个新帖子,以更好地解释我想要做什么。感谢您到目前为止的帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多