MySQL只为新行插入触发器

时间:2016-07-12 12:06:02

标签: mysql triggers

我想在MySQL中使用一个触发器,只有当它是一个新条目时才会在表B中插入表A的信息。

如果表A中有新条目,我的触发器总是将表A的所有委托插入到表B中:

CREATE TRIGGER trigger_insert
AFTER INSERT
ON tableA FOR EACH ROW

BEGIN
    INSERT INTO `tableB`
        (
        `id`,
        `active`,
        `created_at`,
        `updated_at`
        )
    SELECT
        `id`,
        `active`,
        `created_at`,
        NOW()
    FROM
        tableA;

END;

我的问题是,我有第二个触发器,在任何UPDATE之后插入tableA的entrys。所以我不能让id独一无二。结果应该是tableB是tableA

中任何INSERT和UPDATE语句的某种历史记录

感谢任何帮助!

3 个答案:

答案 0 :(得分:1)

您的问题是您从TableA中选择了所有行。我假设你打算:

INSERT INTO `tableB`(`id`, `active`, `created_at`, `updated_at`)
    SELECT new.id, new.active, new.created_at, MNW()

您的问题的更一般的答案是在unique上添加tableB约束。假设id定义了重复的条目:

alter table tableB add constaint unq_tableB_id unique (id);

然后更改insert以忽略任何重复的插入:

INSERT INTO `tableB`(`id`, `active`, `created_at`, `updated_at`)
    SELECT `id`, `active`, `created_at`, MNW()
    FROM tableA
    ON DUPLICATE KEY UPDATE id = VALUES(id);

如果您在使用new时仍需要重复项,则可以将它们组合在一起:

INSERT INTO `tableB`(`id`, `active`, `created_at`, `updated_at`)
    SELECT new.id, new.active, new.created_at, MNW()
    ON DUPLICATE KEY UPDATE id = VALUES(id);

这两个查询都假设id是用于定义副本的内容。

答案 1 :(得分:1)

我的问题的解决方案是基于INSERT INTO ... SELECT的错误用法。相反,我必须使用NEW关键字来处理新数据:

CREATE TRIGGER trigger_insert
AFTER INSERT
ON tableA FOR EACH ROW

BEGIN

    INSERT INTO `tableB`
    (
        `id`,
        `active`,
        `created_at`,
        `updated_at`
    )
    VALUES
    (
        NEW.`id`,
        NEW.`active`,
        NEW.`created_at`,
        NOW()
    );
END;

答案 2 :(得分:1)

我不太确定这种方法是否是您想要的,但是如果您想将另一种语言与MySql连接,这可能会起作用-对我而言确实如此。

x = SELECT MAX(id) FROM Forum; //This won't work. It isn't real code

这显示添加的最新行的ID。如果之后有一个大于此的id,那么我们知道已经添加了新行。

While True:
    y = SELECT MAX(id) FROM Forum;
    if y > x:
        x = y //This makes the new largest id the actual largest id
        //make add new row to other table

在线上有用于将编程语言与MySql连接的教程,例如https://pynative.com/python-mysql-insert-data-into-database-table/。这将使您可以将我的伪代码转换为真实代码。

此代码不是实际的代码,因此您不能只复制它,而只是我所做的伪代码。