FreeOZ论坛

标题: 什么方法最好?用小表更新总表 [打印本页]

作者: xblues    时间: 29-9-2009 08:27
提示: 作者被禁止或删除, 无法发言 标题: 什么方法最好?用小表更新总表
我有一个总表,有所有记录。总表有一个主键 email address
还有一个临时表,有当天的记录。

我想用临时表根据主键email address去更新总表,临时表里的email address 可能会有重复,以最后的记录为准。
更新的时候,如果遇到已经有的Email address 就UPDATE其他字段,如果是新的email 就 INSERT整条记录。

我想类似的操作应该比较常用,所以考试是不是写一个存储过程来作为通用功能实现这个更新。
当然,原来一直采用客户端c#编程的方式,逐条读入判断,然后更新。

大家觉得哪种方法更有优势一些?给这个方式写存储过程的同志多么?
作者: procoder    时间: 29-9-2009 13:38
这就是银行的跑批操作,每天晚上做。
作者: earthengine    时间: 29-9-2009 14:36
原帖由 xblues 于 29-9-2009 07:27 发表
大家觉得哪种方法更有优势一些?给这个方式写存储过程的同志多么?

要是我,两种方法我都不用。我会写一段SQL,直接让C#扔给数据库执行。

写存储过程效率会稍微高一些,但维护麻烦。C#逐条编程效率不高,且代码量会大一些。
作者: coredump    时间: 29-9-2009 15:44
如果数据量很小就无所谓了,什么方法方便用什么。用过数据量很大,可以考虑一些数据库专用的同步和复制机制。比如ORACLE的RMAN可以很方便得处理这样的情况。
作者: zergling_zzh    时间: 29-9-2009 17:47
标题: 回复 #1 xblues 的帖子
如果没有特殊要求,用你最擅长的方式做啊。
对了,如果你的数据库是mysql, 有insert .. on duplicate update... 这样的语法,估计其他数据库也有吧,能够省些事。
作者: Fernando    时间: 30-9-2009 20:33
  加油加油
作者: xblues    时间: 1-10-2009 01:33
提示: 作者被禁止或删除, 无法发言 我们现在的生产数据库是Oracle,分析数据库是MS SQL。

由于是从Oracle倒数据到MS SQL,因此那些MS SQL 或者 Oracle 等数据库专有的同种数据库同步的功能是没办法用了。目前用BCP包来同步。

生产数据库目前是有主键的,BCP包截取新增部分,查重,再更新(UPDATE和INSERT)分析数据库。

我觉得主键是很重要的,可以有时候更新有主键和自动增长的表,很麻烦,修改类似表的结构也很麻烦,不妨直接修改,必须删除,重新建立。

我目前临时表的查重功能使用的是SQL的ROW_NUMBER()函数。




欢迎光临 FreeOZ论坛 (https://www.freeoz.org/bbs/) Powered by Discuz! X3.2