ODI修改主键后刷新失败解决方案

ODI增量刷新,修改主键值后,会导致刷新失败。解决办法:使用表中值固定不定的列作为增量刷新的依据列。

演示如下:

如上,源表和目标表有相同的记录。现修改源表主键信息

执行数据同步刷新后,目标表数据如下

发现,源表在update主键时,执行同步后,会向目标表新插入一条记录,原主键值记录仍保留在库中。

解决方案:从源表中找出一列(一组)固定不定的字段,目标表中以源表固定不变的字段建立主键,作为更新的依据。

如下:

源表ORDTASK2,主键为ORDNO,METHODCODE;在做数据集成时,我们认为ORIGREC是唯一的,并且加了唯一索引与NOT NULL为约束,值永远不会变化(也就对应到目标表的主键对应到ORDTASK2.ORIGREC)。

目标表ORDTASK3,主键为ORIGREC

为源表启用日志,并添加到CDC中,如下图,ORDTASK2前面加上了小时钟

这时需要修改ORDTASK2上面的触发器、及与日志信息相关的几个表、视图。

先修改日志表

取消原来定义的ORDNO、METHODCODE,修改为ORIGREC。接着,修改触发器

将ORIGREC写入日志表J$ORDTASK2,再修改jv$dordtask2、jv$ordtask2

以上修改操作后,数据同步操作已基本没问题,接下来创建映射ORDTASK2

测试数据同步

为ORDTSK2添加一条数据

如图,ORDTASK2日志表中已经捕捉到这一数据变化。执行数据同步

发现ORDTASK3目标表已经同步过来了。

修改非主键TESTNO为”TN00100”

执行同步

数据已经同步

更新主键值ORDNO修改为“A0010”

执行同步

ORDTASK3数据已刷新

修改主键+非主键

执行同步

删除数据测试

删除ORDTASK2中数据

执行同步

同步成功!

时间: 2024-11-09 02:27:16

ODI修改主键后刷新失败解决方案的相关文章

百万数据修改索引,百万数据修改主键

原文:百万数据修改索引,百万数据修改主键 当百万数据时,如果修改主键,那么会自动重建索引,所以操作会非常慢,经常会超时,错误提示类似: 超时时间已到.在操作完成之前超时时间已过或服务器未响应 解决方案:不要采用手动添加主键或者索引,而采用sql语句修改主键或者索引,当然很多人这个sql不会写,也不要紧,sql自带了,两步走,第一:点开表设计,添加一个索引或者主键,如图 第二:关闭后,右键,有一个生成更改脚本,如图: 点击生成,复制里面的脚本,关闭当前页面,记住,不要保存哦....然后运行这个sq

创建和修改主键 (SQL)

添加主键, ALTER TABLE [表名:OrderInfo] Add PRIMARY KEY ([列名:ProductID, UserID...])  多个列则是组合主键 删除主键, ALTER TABLE [表名:OrderInfo] DROP PRIMARY KEY 修改主键,先执行删除 ALTER TABLE [表名:OrderInfo] DROP PRIMARY KEY 语句删除现有主键, 然后执行 ALTER TABLE [表名:OrderInfo] Add PRIMARY KEY

veridata实验举例(5)修改主键上的列值,update操作会被拆分成两条语句

veridata实验举例(5)修改主键上的列值,update操作会被拆分成两条语句 续接"veridata实验举例(4)验证veridata查找出updata.delete操作导致的不同步现象",地址:点击打开链接 环境: Item Source System Target System Platform Red Hat Enterprise Linux Server release 5.4 Red Hat Enterprise Linux Server release 5.4 Hos

Mysql复制表结构、表数据以及修改主键

mysql查看表结构命令 show columns from 表名; 1.复制表结构及数据到新表 CREATE TABLE 新表SELECT * FROM 旧表 这种方法会将oldtable中所有的内容都拷贝过来,当然我们可以用delete from newtable;来删除. 不过这种方法的一个最不好的地方就是新表中没有了旧表的primary key.Extra(auto_increment)等属性.需要自己用"alter"添加,而且容易搞错.     2.只复制表结构到新表 CRE

Oracle查询--增加--删除--修改主键

对Oracle表主键的操作,有四类:查询,增加,修改,删除 1.查询主键 /*查询某个表中存在的约束*/ select * from user_constraints where table_name='表名大写'; 查询结果显示约束类型,约束名称,不显示约束在哪个字段上 /*查询某个表各字段约束*/ select * from user_cons_columns where table_name='表名大写'; 查询结果显示约束名称,字段名称,不显示约束类型 /*查询某个表的主键约束*/ se

9、修改主键

1.oracle主键修改的思路是:先判断主键是否存在,如果存在则先删除后新建,如果不存在,则直接新建,如下: 注意: declare与alter之间要有反斜杠/,否则报错: 主键如果不存在的话,ALTER TABLE TEST_CLASS DROP PRIMARY KEY;是会报错的,因此必须先判断是否存在再执行删除语句: 原文地址:https://www.cnblogs.com/wf2010517141/p/10329173.html

mysql数据库修改主键自增及出现的问题

1.创建数据库: create database user ( uid int not null, username varchar(25) not null, password varchar(25) not null. primary key(uid) ); 该语句创建的数据库的主键是user,但是没有设置改字段自增,第一条数据就从0开始.向数据库插入第二条数据而不指定uid的时候就会报错.那如何修改该字段使其自增呢? alert table user modify uid int(4)au

mysql 创建主键,修改主键

//添加一个字段pid并且设置为主键(auto_increment)自增(auto_increment),不可为null,类型为int unsigned alter table table1 add pid int unsigned not null auto_increment primary key; //可以将一个主键修改为0 update table1 set pid=0 where pid=6; 假设id为主键,id可以保证字段数据唯一性,但是一张表只有一个主键.主键的值:修改成的0,

sqlite并不支持建表后修改主键,或删除列,如果要修改,请参考如下做法

SQLite has limited ALTER TABLE support that you can use to add a column to the end of a table or to change the name of a table. If you want to make more complex changes in the structure of a table, you will have to recreate the table. You can save ex