使用相同的登台表触发器的MySQL REPLACE表值,无需定义列

时间:2019-04-16 13:22:22

标签: mysql

在MySQL 8数据库中,我有两个处于不同模式的相同表,其中一个用作其等效生产表的临时表。这些表包含200多个列,将来还会添加更多列,因此很难为列名明确定义值。

我需要使用AFTER INSERT触发器将生产表中的值与登台表中的值进行INSERT或UPDATE,其中在生产表中一行的所有值都在存在重复的PRIMARY KEY的情况下被替换。请注意,生产表已定义了其PRIMARY KEY。

此后,我应该从登台表中删除所有行。

这是我尝试过的代码:

CREATE TRIGGER stage.my_table_after_insert AFTER INSERT ON my_table
FOR EACH ROW
BEGIN
    REPLACE INTO prod.my_table
        SELECT * FROM new;
    DELETE FROM stage.my_table
END

2 个答案:

答案 0 :(得分:0)

我不明白您为什么这样做,但为什么不这样做:

REPLACE INTO prod.my_table
SELECT * FROM stage.my_table; 
DELETE FROM stage.my_table;

答案 1 :(得分:0)

您不能在其自身包含的触发器内更改表。此外,使用触发器将每行执行一次所有SQL语句(这种情况下效率低下)。因此,可以使用以下程序代替执行所需功能的程序:

DELIMITER $$
CREATE PROCEDURE stage.load_data()
BEGIN
    REPLACE INTO prod.my_table
    SELECT * FROM stage.my_table; 
    DELETE FROM stage.my_table;
END$$
DELIMITER ;