日期:2014-05-18  浏览次数:20627 次

查询、导入、更新
本来用“insert into tb_queue (phone,msg,status) select phonenumber,content,state from messagesend_t where state='0'”这条语句已经实现从messagesend_t里state=‘0’的数据插入到tb_queue ,然后再用update语句更新,使state=‘1’,但程序在执行这条语句的时候可能存在将更生成,即state=‘0’,还没来得及导入到tb_queue里的数据也给更新了。有什么好的办法?
我想的实现办法是从messagesend_t里查询出一条state='0'的数据,然后插入到tb_queue 里,插入成功则更新,使其state=‘1’,这种方法对数据库的影响大不?使用的Oracle数据库,.net环境 c#

------解决方案--------------------
SQL code
insert into tb_queue (phone,msg,status) select phonenumber,content, 1 from messagesend_t where state='0'

------解决方案--------------------
其实 只要你按照现插入后更新的顺序,在数据库中会按照步骤先插入后更新的
当然一般的插入语句和更新语句都要加上事物,以防不测

------解决方案--------------------
其实是一样的道理
如果不妨先加一个if判断

SQL code
insert into tb1 select ... from tb2 where state = '0'

if exists(select 1 from tb1 where status = '0')
begin
   update tb2 ...
end
else
begin
   return ;--这个地方可以写插入错误的提示
end

------解决方案--------------------
为什么你要先插入后更新呢?
直接插入不就得了。。
insert into tb_queue (phone,msg,‘1’) 
select phonenumber,content,state from messagesend_t where state='0'
------解决方案--------------------
错了。。是insert into tb_queue (phone,msg,status) select phonenumber,content, 1 from messagesend_t where state='0'

------解决方案--------------------
探讨
引用:
SQL code

insert into tb_queue (phone,msg,status) select phonenumber,content, 1 from messagesend_t where state='0'

最后要更新的是messagesend_t里的数据,使state=‘1’,不是tb_queue