我有一个主数据库,并且定期将数据从该数据库移动到第二个数据仓库。
我不想每次迁移整个表,而只想迁移自上次运行以来已更改的行。这很容易与WHERE子句一起使用。但是,假设主数据库中已删除了某些行。我没有很好的方法来检测哪些行不再存在,因此我也可以在数据仓库中删除它们。有没有办法做到这一点? (与每次重新加载整个表格相反,因为表格很大)
答案 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)
);
创建CDC:
CREATE TABLE CUSTOMERS_CDC(
ID INT NOT NULL,
LAST_UPDATED DATETIME,
PRIMARY KEY (ID)
);
在删除事件上触发源表(如下所示):
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