迁移数据时如何检测删除的行
How to detect deleted rows when migrating data
我有一个主数据库,并定期将数据从该数据库移动到第二个数据仓库。
我不想每次都迁移整个 table,而是只想迁移自上次 运行 过程以来发生更改的行。使用 WHERE 子句很容易做到这一点。但是,假设主数据库中的某些行已被删除。我没有好的方法来检测哪些行不再存在,因此我也可以在数据仓库中删除它们。有没有好的方法来做到这一点? (与每次重新加载整个 table 相反,因为 table 很大)
如果您只是触发更新查询,那么它不会更新行。
我的看法:假设您有自己的方式来执行 where 子句。 Youd have that as part of update query,除非你正在进行csv导出。如果您对要更新的行进行 mysql 转储并在主数据库中创建一个新的临时表,
然后
UPDATE mainTable WHERE id = (SELECT id from tempTable WHERE id >0 and id <1000)
如果没有对应的匹配项,则不会更新 运行,并且不会发生错误,通过使用 id 限制作为参数。
可以按照以下步骤完成,假设在这个例子中我使用的是客户 table:
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)
);
创建 CDC:
CREATE TABLE CUSTOMERS_CDC(
ID INT NOT NULL,
LAST_UPDATED DATETIME,
PRIMARY KEY (ID)
);
在源 table 上触发删除事件,如下所示:
CREATE TRIGGER TRG_CUSTOMERS_DEL
ON CUSTOMERS
FOR DELETE
AS
INSERT INTO CUSTOMERS_CDC (ID, LAST_UPDATED)
SELECT ID, getdate()
FROM DELETED
在查询源更改的 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
我有一个主数据库,并定期将数据从该数据库移动到第二个数据仓库。
我不想每次都迁移整个 table,而是只想迁移自上次 运行 过程以来发生更改的行。使用 WHERE 子句很容易做到这一点。但是,假设主数据库中的某些行已被删除。我没有好的方法来检测哪些行不再存在,因此我也可以在数据仓库中删除它们。有没有好的方法来做到这一点? (与每次重新加载整个 table 相反,因为 table 很大)
如果您只是触发更新查询,那么它不会更新行。
我的看法:假设您有自己的方式来执行 where 子句。 Youd have that as part of update query,除非你正在进行csv导出。如果您对要更新的行进行 mysql 转储并在主数据库中创建一个新的临时表,
然后
UPDATE mainTable WHERE id = (SELECT id from tempTable WHERE id >0 and id <1000)
如果没有对应的匹配项,则不会更新 运行,并且不会发生错误,通过使用 id 限制作为参数。
可以按照以下步骤完成,假设在这个例子中我使用的是客户 table:
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)
);
创建 CDC:
CREATE TABLE CUSTOMERS_CDC( ID INT NOT NULL, LAST_UPDATED DATETIME, PRIMARY KEY (ID) );
在源 table 上触发删除事件,如下所示:
CREATE TRIGGER TRG_CUSTOMERS_DEL ON CUSTOMERS FOR DELETE AS INSERT INTO CUSTOMERS_CDC (ID, LAST_UPDATED) SELECT ID, getdate() FROM DELETED
在查询源更改的 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