两个表都增加主键,erp表的主键每次都从同一个序列中获取,这样erp表的主键就肯定不会有重复 两表都增加主键就好解决多了 insert into stg(id,c1,c2,c3,c4……) select id,c1,c2,c3,c4…… from erp where not exist (select 1 from stg where id=erp.id)
①每次都把STG表的数据清空,重新插入; ②如果①不现实,则对比STG和ERP的数据,做ERP-STG操作,把ERP中存在但STG中不存在的数据抽取到STG,此过程中需要注意ERP中重复记录条数和对应的STG中记录的条数,如果ERP中多,则往STG中插入条数等于两者之差的记录; ③其实①和②的做法都不规范,如果能修改ERP的表结构,建议加一列ErpID作为主键,如果是oracle数据库,不建议使用rowid,因为某些情况下rowid是会改变的; ④ERP中加触发器,只要有insert,就同时insert into STG,delete的情况自己考虑一下,不过不建议使用触发器; ⑤不知道楼主的业务逻辑是什么样的,数据现在是用什么方式抽取的,建议还是根据业务逻辑想想办法,只简单地这么问,估计大家提出的解决方案不会太适合你。
手工加一列吧,用个 sequence 来填充,不然处理数据时,太难受。
option 1. 加一个主键列 option 2. 看你的原表是否有ERP是否有时间戳列,如记录创建时间, 如果有,可以利用这个列来做条件。 option 3. 使用merge, 结合使用option 2 Merge into STG Using ( select * from ERP where creation_date >= last pull time ) erp_t on ( STG.C1 = erp_t.C1 AND STC.C2 = erp_t.C2 ) when NOT MATCHED THEN INSERT (C1,C2) VALUES (erp_t.C1, erp_t.C2) when MATCHED THEN NULL;
insert into stg(c1,c2,c3,c4……)
select c1,c2,c3,c4……
from erp
where (c1,c2,c3,c4……) not in (select c1,c2,c3,c4…… from stg)
是rownum?这个是结果集的伪列,在数据中没有存储,并且rownum每次都是从1开始取,不能作为主键
是row_number?这个是分析函数中的用法,也不能作为主键
是rownum?这个是结果集的伪列,在数据中没有存储,并且rownum每次都是从1开始取,不能作为主键
是row_number?这个是分析函数中的用法,也不能作为主键对啊,这个只能查询用,不能存储的
是rownum?这个是结果集的伪列,在数据中没有存储,并且rownum每次都是从1开始取,不能作为主键
是row_number?这个是分析函数中的用法,也不能作为主键
在oracle中对应的是RowID,它和查询语句无关,和记录在文件系统的位置有关。 如果删除一条记录后,新增的记录会重写在删除记录的物理地址上,有些数据库会导致RowNumber重复。
是rownum?这个是结果集的伪列,在数据中没有存储,并且rownum每次都是从1开始取,不能作为主键
是row_number?这个是分析函数中的用法,也不能作为主键
在oracle中对应的是RowID,它和查询语句无关,和记录在文件系统的位置有关。 如果删除一条记录后,新增的记录会重写在删除记录的物理地址上,有些数据库会导致RowNumber重复。
把一条记录从A表插入到B表,即使数据完全一致,他们的ROWID也是不一样的,没法用这个比较两个表的差异的
rowid做单独一个表的主键可以,但是作为两个表关联的条件就不可以了
是rownum?这个是结果集的伪列,在数据中没有存储,并且rownum每次都是从1开始取,不能作为主键
是row_number?这个是分析函数中的用法,也不能作为主键
在oracle中对应的是RowID,它和查询语句无关,和记录在文件系统的位置有关。 如果删除一条记录后,新增的记录会重写在删除记录的物理地址上,有些数据库会导致RowNumber重复。
把一条记录从A表插入到B表,即使数据完全一致,他们的ROWID也是不一样的,没法用这个比较两个表的差异的
rowid做单独一个表的主键可以,但是作为两个表关联的条件就不可以了
两个表之间的Rowid比较没有意义,Rowid只在表内才有意义。 一般是需要避免依赖rowid来建立逻辑关系。
楼主需要在导出表的时候,把rowid导出来,就是说备份的表会多一列[srcRowID],比较的时候,用这个srcRowID和源表中实际的rowid进行比较就可以了
是rownum?这个是结果集的伪列,在数据中没有存储,并且rownum每次都是从1开始取,不能作为主键
是row_number?这个是分析函数中的用法,也不能作为主键
在oracle中对应的是RowID,它和查询语句无关,和记录在文件系统的位置有关。 如果删除一条记录后,新增的记录会重写在删除记录的物理地址上,有些数据库会导致RowNumber重复。
把一条记录从A表插入到B表,即使数据完全一致,他们的ROWID也是不一样的,没法用这个比较两个表的差异的
rowid做单独一个表的主键可以,但是作为两个表关联的条件就不可以了
两个表之间的Rowid比较没有意义,Rowid只在表内才有意义。 一般是需要避免依赖rowid来建立逻辑关系。
楼主需要在导出表的时候,把rowid导出来,就是说备份的表会多一列[srcRowID],比较的时候,用这个srcRowID和源表中实际的rowid进行比较就可以了
这种方式还不如增加主键呢,反正得动数据结构
用rowid做关联很不靠谱,一旦系统崩溃,用备份的数据进行恢复,两个表的关联关系就没有了
两表都增加主键就好解决多了
insert into stg(id,c1,c2,c3,c4……)
select id,c1,c2,c3,c4……
from erp
where not exist (select 1 from stg where id=erp.id)
我的意思是你这个target表的设计有问题。既要历史数据,又不对历史数据做区分。不过不做区分的话,其他的表关联过来谁知道你哪条数据是当前有效的。甚至代理键都没有。
②如果①不现实,则对比STG和ERP的数据,做ERP-STG操作,把ERP中存在但STG中不存在的数据抽取到STG,此过程中需要注意ERP中重复记录条数和对应的STG中记录的条数,如果ERP中多,则往STG中插入条数等于两者之差的记录;
③其实①和②的做法都不规范,如果能修改ERP的表结构,建议加一列ErpID作为主键,如果是oracle数据库,不建议使用rowid,因为某些情况下rowid是会改变的;
④ERP中加触发器,只要有insert,就同时insert into STG,delete的情况自己考虑一下,不过不建议使用触发器;
⑤不知道楼主的业务逻辑是什么样的,数据现在是用什么方式抽取的,建议还是根据业务逻辑想想办法,只简单地这么问,估计大家提出的解决方案不会太适合你。
option 2. 看你的原表是否有ERP是否有时间戳列,如记录创建时间, 如果有,可以利用这个列来做条件。
option 3. 使用merge, 结合使用option 2 Merge into STG
Using (
select * from ERP
where creation_date >= last pull time
) erp_t
on (
STG.C1 = erp_t.C1
AND STC.C2 = erp_t.C2
)
when NOT MATCHED THEN
INSERT (C1,C2) VALUES (erp_t.C1, erp_t.C2)
when MATCHED THEN
NULL;