如何在迁移数据时检测已删除的行

时间:2015-10-22 18:17:39

标签: mysql etl data-warehouse

我有一个主数据库,并且定期将数据从该数据库移动到第二个数据仓库。

我不想每次迁移整个表,而只想迁移自上次运行以来已更改的行。这很容易与WHERE子句一起使用。但是,假设主数据库中已删除了某些行。我没有很好的方法来检测哪些行不再存在,因此我也可以在数据仓库中删除它们。有没有办法做到这一点? (与每次重新加载整个表格相反,因为表格很大)

2 个答案:

答案 0 :(得分:0)

如果您只是触发更新查询,那么它不会更新行。

我看到的方式:让我们说你有办法在哪里做一个where子句。除非您正在执行csv导出,否则您将其作为更新查询的一部分。如果对要更新的行执行mysql转储并在主数据库中创建新的tempTable,

然后

UPDATE mainTable WHERE id = (SELECT id from tempTable WHERE id >0 and id <1000) 

如果没有相应的匹配,则使用id限制作为参数,不会运行任何更新,也不会发生错误。

答案 1 :(得分:0)

可以按照以下步骤完成,我想在这个例子中我使用的是客户表:

CREATE TABLE CUSTOMERS(
   ID   INT              NOT NULL,
   NAME VARCHAR (20)     NOT NULL,
   AGE  INT              NOT NULL,
   ADDRESS  CHAR (25) ,
   LAST_UPDATED DATETIME,
   PRIMARY KEY (ID)
);
  1. 创建CDC:

    CREATE TABLE CUSTOMERS_CDC( 
    ID   INT              NOT NULL,
    LAST_UPDATED DATETIME,
    PRIMARY KEY (ID)
    );
    
  2. 在删除事件上触发源表(如下所示):

    CREATE TRIGGER TRG_CUSTOMERS_DEL 
    ON CUSTOMERS
    FOR DELETE
    AS
         INSERT INTO CUSTOMERS_CDC (ID, LAST_UPDATED)
         SELECT ID, getdate()
         FROM DELETED
    
  3. 在您查询更改源的ETL过程中,通过UNION添加已删除的记录信息或创建如下所示的单独过程:

    SELECT ID, NAME, AGE, ADDRESS, LAST_UPDATED, ‘I/U’ STATUS 
    FROM CUSTOMERS 
    WHERE LAST_UPDATED > @lastpulldate
    UNION
    SELECT ID, null, null, null, LAST_UPDATED, ‘D’ STATUS 
    FROM CUSTOMERS_CDC 
    WHERE LAST_UPDATED > @lastpulldate