【问题标题】:Duplicates data after joining trigger table with other tables将触发器表与其他表连接后重复数据
【发布时间】:2021-05-24 19:12:02
【问题描述】:

每当有更新时,我想从 TableProduct 中获取 BEFORE 和 AFTER 数据。因此,我创建了一个 Before 和 After 触发器查询,其中触发器的相关值存储在名为 TableProduct_Before 和 TableProduct_After 的单独表中。

我的挑战是,每当我尝试 INNER JOIN 三个表时,我总是会得到重复的结果。

我已经尝试过 DISTINCT 和 ORDER BY ID 命令,但仍然是同样的挑战。

我进行了查询,我被告知我不能加入触发器表值,因为它没有外键,我尝试添加外键,但它没有工作,说 TableProduct 中已经存在外键。

请,我将不胜感激,谢谢。

【问题讨论】:

    标签: mysql sql triggers duplicates inner-join


    【解决方案1】:

    您误解了触发器的工作原理。您可以使用前触发器或后触发器。

    关键是使用newold。在触发器的主体内部,既有旧值又有新值。在伪代码中,这看起来像:

    insert into archive (pk, old_value, new_value)
        values (new.pk, old.value, new.value);
    

    【讨论】:

    • 我对触发器的使用很好,我能够检索到我想要的信息。我的挑战是尝试使用 INNER JOIN 将表连接在一起时得到的重复数据。当我将触发器表值和原始表值连接在一起时,我试图消除重复值。
    【解决方案2】:

    OLD 和 NEW 数据在触发前和触发后均可用。

    不同之处在于 - BEFORE 触发器修复了更新尝试,而 AFTER 修复了成功的尝试结果。 IE。无论如何都会执行 BEFORE(但它的更改可能会被回滚!),而不是 AFTER。

    https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=dd19c611c7e2fbef88b2133dcaa61dfa

    PS。最近的 MySQL 版本允许触发器链 - 同一个事件上的许多触发器一个接一个地触发。因此,请检查您的保存触发器是否位于此链中的最后一个。

    【讨论】:

    • 我对触发器的使用很好,我能够检索到我想要的信息。我的挑战是尝试使用 INNER JOIN 将表连接在一起时收到的重复数据。当我将触发器表值和原始表值连接在一起时,我试图消除重复值。
    • @AdolijeEmmanuel 如果您想删除重复值,则仅使用其中一个触发器,而不是同时使用两者 - 如果您想保存任何尝试,包括不成功,则在之前,如果您只需要保存,则在之后成功的尝试。
    猜你喜欢
    • 2021-08-22
    • 1970-01-01
    • 2015-08-01
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多