找回密码
 FreeOZ用户注册
查看: 1396|回复: 6
打印 上一主题 下一主题

[论坛技术] 什么方法最好?用小表更新总表

[复制链接]
跳转到指定楼层
1#
发表于 29-9-2009 08:27:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
提示: 作者被禁止或删除, 无法发言

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?FreeOZ用户注册

x
我有一个总表,有所有记录。总表有一个主键 email address
还有一个临时表,有当天的记录。

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

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

大家觉得哪种方法更有优势一些?给这个方式写存储过程的同志多么?
回复  

使用道具 举报

2#
发表于 29-9-2009 13:38:37 | 只看该作者
这就是银行的跑批操作,每天晚上做。
回复  

使用道具 举报

3#
发表于 29-9-2009 14:36:30 | 只看该作者

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

写存储过程效率会稍微高一些,但维护麻烦。C#逐条编程效率不高,且代码量会大一些。
回复  

使用道具 举报

4#
发表于 29-9-2009 15:44:58 | 只看该作者
如果数据量很小就无所谓了,什么方法方便用什么。用过数据量很大,可以考虑一些数据库专用的同步和复制机制。比如ORACLE的RMAN可以很方便得处理这样的情况。
回复  

使用道具 举报

5#
发表于 29-9-2009 17:47:39 | 只看该作者

回复 #1 xblues 的帖子

如果没有特殊要求,用你最擅长的方式做啊。
对了,如果你的数据库是mysql, 有insert .. on duplicate update... 这样的语法,估计其他数据库也有吧,能够省些事。
回复  

使用道具 举报

6#
发表于 30-9-2009 20:33:01 | 只看该作者
  加油加油
回复  

使用道具 举报

7#
 楼主| 发表于 1-10-2009 01:33:16 | 只看该作者
提示: 作者被禁止或删除, 无法发言
我们现在的生产数据库是Oracle,分析数据库是MS SQL。

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

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

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

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

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+11, 1-2-2025 05:30 , Processed in 0.016011 second(s), 22 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表