首页 新闻 会员 周边

请教一个数据保存到数据库中的问题

0
悬赏园豆:50 [待解决问题]

在程序中对一个数据的保存使用先select语句查数据是否存在,然后根据返回结果判定是执行insert还是update操作。

if(select){update}else{insert}

如果使用直接执行update语句,而后根据update语句返回的受影响还行,如果没有受影响行说明数据库中没有数据这次应该是插入操作执行insert语句。

if(update=0){insert}

 

这两种写大家觉得那种效率更好。因本对sql分析不了解希望大家一起讨论一下。

Airow的主页 Airow | 初学一级 | 园豆:152
提问于:2013-06-09 15:31
< >
分享
所有回答(8)
0

先使用ctrl+L 查看执行计划

然后 在 IO !!

有一个专门函数是干这个的 存在修改不存在插入  merge

http://www.cnblogs.com/CareySon/archive/2012/03/07/2383690.html

哇~怪兽 | 园豆:622 (小虾三级) | 2013-06-09 15:42
0

最好是程序端判断是新建还是修改

当然如果用户需求很bt,可以先select,再根据结果insert还是update

飞来飞去 | 园豆:2057 (老鸟四级) | 2013-06-09 16:33

最好是程序端判断是新建还是修改 是什么意思

跟先select,再根据结果insert还是update有区别吗

支持(0) 反对(0) Airow | 园豆:152 (初学一级) | 2013-06-09 16:54

@Airow: 就是在前台那里定好了,用户在新建页面的操作只是insert,如果有重复数据,直接报错,而不是update原有数据.

支持(0) 反对(0) 飞来飞去 | 园豆:2057 (老鸟四级) | 2013-06-09 17:35
0

建议根据第一中方式实现,首先就处理逻辑上更清晰,同时一旦出现问题,在调试程序时更容易定位问题所在。

绝云气 | 园豆:199 (初学一级) | 2013-06-09 16:56
0

不知道你这个IF判断是程序里还是数据库的,从你的需求来看,可以放到数据库里一个SQL语句可以搞定,所以是先判断或先写入,性能应该不会影响太大。

happydaily | 园豆:301 (菜鸟二级) | 2013-06-09 18:13
0

逻辑清晰的话肯定是先判断在决定是insert还是update老~性能的话打开执行计划看下不就知道了吗..或者用Stopwatch监视下感觉不会差别太大~

红烧狮子头 | 园豆:195 (初学一级) | 2013-06-09 19:16
0

1楼说的MERGE是sql server2008新引用的,不知道楼主使用的什么数据库。

sqlserver的话可以直接写到一条sql语句里:

如果木有更新成功就插入

update  table1 set ....where .... IF @@ROWCOUNT=0 insert into table1(...) values(...)

我的项目是这么用的,我们数据量不是特别大,使用起来觉得性能ok

+小马哥++ | 园豆:906 (小虾三级) | 2013-06-10 15:44
0

第二种省去了查询效率高些

cel | 园豆:380 (菜鸟二级) | 2013-06-11 11:20
0

建议第一种,第二种方法每次会执行Update操作,会导致锁表,在数据量大的时候严重影响效率。

Zachary_Fan | 园豆:762 (小虾三级) | 2013-06-21 23:07
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册