【问题标题】:How to update a table in different database with data from current table?如何使用当前表中的数据更新不同数据库中的表?
【发布时间】:2020-07-26 00:19:01
【问题描述】:

我在两个独立的数据库中有两个表。但是,它们应该具有相同的数据。我想确保每当我从database_a 更改table_a 中的数据时,它们都会反映在database_btable_b 中。

我可以运行任何 MySQL 命令来实现此目的吗?

我读了这个问题:Copy Data from a table in one Database to another separate database,但它似乎是插入数据而不是更新它。

谢谢。

【问题讨论】:

  • 两个数据库是在同一台服务器上安装的同一个mysql,还是在不同的服务器上?
  • @patrick3853 他们在同一台服务器上。 :)

标签: mysql database


【解决方案1】:

实现这一点的最佳方法是使用触发器。我没有测试过这个,但它给了你这个想法。

DELIMITER $$

CREATE
    TRIGGER table_a_after_insert AFTER INSERT 
    ON database_a.table_a
    FOR EACH ROW BEGIN
        -- update to match columns in your table
        INSERT INTO database_b.table_b (
            id,
            name
        )
        VALUES (
            NEW.id,
            NEW.name
        );
    END$$


CREATE
    TRIGGER table_a_after_update AFTER UPDATE
    ON database_a.table_a
    FOR EACH ROW BEGIN
        DECLARE updated_rows INT;

        -- again update the column list to match your table
        UPDATE database_b.table_b
        SET
            name = NEW.name
        WHERE id = NEW.id;

        -- in case the row didn't already exist in table_b, insert it
        SET @updated_rows = ROW_COUNT();
        IF updated_rows = 0
        THEN
            INSERT INTO database_b.table_b (
                id,
                name
            )
            VALUES (
                NEW.id,
                NEW.name
            );
        END IF;
    END$$


CREATE
    TRIGGER table_a_after_delete AFTER DELETE
    ON database_a.table_a
    FOR EACH ROW BEGIN
        -- obviously update the column list to match the columns in your table
        DELETE FROM database_b.table_b
        WHERE id = OLD.id;
    END$$

您必须确保用户拥有对 database_b.table_b 的正确权限

【讨论】:

    【解决方案2】:

    您可以将数据库触发器 (https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html) 用于此类操作。

    CREATE TRIGGER triggername AFTER INSERT ON database_a.table_a
      FOR EACH ROW
      BEGIN
        INSERT INTO database_b.table_b (id, ...) VALUES (NEW.id, ...);
      END;
    

    但是,您必须为每个事件创建触发器。插入table_a时需要插入table_b,从table_a中删除时需要从table_b中删除,以此类推。

    €dit:例如更新可能如下所示:

    CREATE TRIGGER triggername AFTER UPDATE ON database_a.table_a  FOR EACH ROW
      UPDATE TABLE database_b.table_b
      SET table_b.id = NEW.id,
          ...(SET each column here)...
      WHERE table_b.id = NEW.id;
    

    【讨论】:

    • 谢谢罗杰。这是否还会更新现有行的信息,而不仅仅是插入新行?
    • 我建议使用 AFTER INSERT 而不是 BEFORE INSERT 以防查询因某种原因失败。
    • @RealNoob 我更清楚地更新了我的帖子。您将不得不编写不同的更新语句。并且不要忘记删除;)。
    猜你喜欢
    • 2011-08-15
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 2022-10-24
    相关资源
    最近更新 更多