社区
应用实例
帖子详情
能不能只更新改变的字段
robertzy
2004-12-03 04:20:40
在前台如果改变了某些字段得值(不是全部),在后台的存储过程怎么只更新那些改变的值,而不是全部。例如,表有10个字段,用户在前台只更新了其中几个,怎么样作检查并相应的更新。我不想象这样做:
Update table1 set col1=@col1, col2=@col2,......col10=@col10.
但我不只怎么做
...全文
617
21
打赏
收藏
能不能只更新改变的字段
在前台如果改变了某些字段得值(不是全部),在后台的存储过程怎么只更新那些改变的值,而不是全部。例如,表有10个字段,用户在前台只更新了其中几个,怎么样作检查并相应的更新。我不想象这样做: Update table1 set col1=@col1, col2=@col2,......col10=@col10. 但我不只怎么做
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
21 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
acenk
2004-12-10
打赏
举报
回复
再加一个参数表示是否更新就可以啊
631799
2004-12-10
打赏
举报
回复
--每隔一段时间查一次表,时间间隔不定,每次要查到表里面对于上次查询时不同的数据,
--也就是说在上次查询完一直到这次查询开始前,中间发生的所有的update和insert的数据都要被查出来.不用建临时表!
/*方案1,触发器+标识字段(要求你的表中有主键)
在你的表中增加一个标识字段: 字段名:标识 类型:bit,默认值:1
写如下触发器:*/
create trigger tr_process on 你的表
for update
as
if update(标识) return
update a set 标识=1
from 你的表 a,inserted b
where a.主键=b.主键
go
--查询的时候,用:
select * from 你的表 where 标识=1
update 你的表 set 标识=0 --查询完成后,将标识设置为0,表示已经查询过
--方案2,用 BINARY_CHECKSUM + 标识字段 (不要求表中有主键,但要写字段列表)
--在你的表中增加一个字段: 字段名:标识 类型:int 默认值:0
--查询时用:
select * from 表
where 标识<>BINARY_CHECKSUM(列1,列2,...列n)
--然后更新标识字段
update 表 set 标识=BINARY_CHECKSUM(列1,列2,...列n)
--方案2的简单示例
declare @t table(a int,b int,标识 int)
insert @t(a) select 1
union all select 2
update @t set 标识=BINARY_CHECKSUM(a,b)
update @t set a=100 where a=2
select a,b from @t
where 标识<>BINARY_CHECKSUM(a,b)
vinsonshen
2004-12-06
打赏
举报
回复
UP
zhang_yzy
2004-12-03
打赏
举报
回复
实在不行,你就在本地先保存一份,当提交时,判断一下不就行了
另外,有些开发工具有这种功能的,
例如DELPHI中在ADO或QUREY 中都有属性可以判断是否被修改了
nksharp
2004-12-03
打赏
举报
回复
for(int i =0 ;i ++; i < 10){ //前台的纪录数目
--
string strupdate;
for(int j =0;j++;j < 10){ //改变的列数
if ( 改变的列){
string strcolumn,strvalues;
strcolumn = 'aa';
strvalues = '1';
strupdate = strupdate + strcolumn + '=' + strvalues;
}
exec(update table set '+strupdate+')
}
就可以把 别弄得太复杂 呵呵 我也就知道这模多了
}
robertzy
2004-12-03
打赏
举报
回复
多谢nksharp,我不大想用statement,因为在存储过程中可以加其它逻辑,如transaction。用statement更新,适应性不强。再看看有没有好办法。
robertzy
2004-12-03
打赏
举报
回复
不大明白,拆分完了再怎么样呢,放到临时表又怎么样呢?
nksharp
2004-12-03
打赏
举报
回复
是丫 你就直接 在前台循环比较更新就可以了 其实根本不用存储过程 反而麻烦 效率不搞
nksharp
2004-12-03
打赏
举报
回复
sql的存贮过程不能传递数组的 你可以用逗号组成一个大字符串 传导后台再拆分 因为你是多行改变的 或者临时表也可以 尝试一下就知道了 我的e-mail:pang_kunlong@hotmail.com 可以把代码发给我看看 如果有必要的话 呵呵
robertzy
2004-12-03
打赏
举报
回复
感觉是执行SQL语句,并不是个存储过程,好像也不太好
robertzy
2004-12-03
打赏
举报
回复
你是说用exec 去执行statement? 不然岂不是要做排列组合。
nksharp
2004-12-03
打赏
举报
回复
引擎怎模做的 问问ms的人把 呵呵 太深了 。。。。。。。。。你可以这样是一下:你穿参数时候 这样传
col2=@col2,col10=@col10.. 把你改变的列名称的字段传过去 后台直接 更新就可以了
jiang130
2004-12-03
打赏
举报
回复
感覺是個概念的問題,你存儲過程的代碼可以在觸發器里做嗎?
robertzy
2004-12-03
打赏
举报
回复
对啊,我就是想知道引擎做了什么事情/怎么做的,
robertzy
2004-12-03
打赏
举报
回复
上面写得有点不清楚,应该是Update table1 set col1=@col1, col2=@col2,......col10=@col10. where id = @id …..反正先就更新一行
nksharp
2004-12-03
打赏
举报
回复
这只能具体问题具体分析了 因为ACCESS中用ole把前台的表邦定了 利用ADO的引擎能够做出判断 但你说的如果直接是传参数的话 可能没有一个公共的方法调用去实现 。。。。反正我是不知道 呵呵 帮你顶顶。。
robertzy
2004-12-03
打赏
举报
回复
其实在前台比较所花费的时间和代码不会太多,而且如果发现没有一个改变,就不用传到SQL了,这样更合理,但关键是我检查出哪几个变了,后台的存储过程怎么写
robertzy
2004-12-03
打赏
举报
回复
是这样的,好比前台有一个表格,如个人的详细信息,有20个字段,每次用户打开后要更新,但我不知道到底会改几个,也可能一个不改。当用户按了更新按钮后,自然要把改的数据保存到数据库,最简单的办法就是写一个存储过程,把前台的数据全部传到SQL去更新,但这样有个问题,如果我的表有个trigger要跟踪某个字段的变化,通常用update(column)去检查,这样一来,即使那个字段没更新,也会让update(column)为真,当然可以用deleted/inserted去比较,但这样就多了一步,如果跟踪的字段多,会影响performance.所以我不知道有没有办法解决这个问题。而且只更新改变的也比较合理,就像在Access中改一样,你改一行的一个字段,其他不悔改的。
nksharp
2004-12-03
打赏
举报
回复
其实你并不知道怎样去检查哪几个字段改变了所以 才又这样的问题 但是你要去检查那几个字段改变了 所花费的时间和代码更多 效率不如直接都更新了快,,,效率与优化始终是一对矛盾。。。:)
liuchunjp
2004-12-03
打赏
举报
回复
更新了几个改几个就行啦。不知道搂主的意思是什么。
加载更多回复(1)
已
更新
或删除的行值要么
不能
使该行成为唯一行,要么
改变
了多个行
其实这种错误是很常见的。当做自己的一个笔记,如果你有遇到像我这样的问题,欢迎参考。也欢迎相互交流。 错误名字:已
更新
或删除的行值要么
不能
使该行成为唯一行,要么
改变
了多个行。 通过查阅资料,发现产生这个问题的最主要的原因是 没有设置主键。如果2条或以上记录内容是相同的,则存储的时候是存为一条数据的,这样修改一条就修改2条(或者多条) 。数据库中出现了重复的键值或数据,当试图删除时,就会
thinkphp 个别
字段
无法
更新
_
更新
数据 · ThinkPHP5.0完全开发手册 · 看云
|版本|调整功能||---|---||5.0.5|添加`data`/`inc`/`dec`/`exp`方法设置数据|##
更新
数据表中的数据~~~Db::table('think_user')->where('id', 1)->update(['name' => 'thinkphp']);~~~如果数据中包含主键,可以直接使用:~~~Db::table('think_user')...
Oracle 中merge into
不能
更新
on中的
字段
解决方法
目录 Oracle 中merge into
不能
更新
on中的
字段
解决方法 1.问题描述 2.merge语法简介 3.Merge示例 4.Merge
更新
on中
字段
问题 Oracle 中merge into
不能
更新
on中的
字段
解决方法 1.问题描述 应用场景中在
更新
数据库之前需要判断库中是否有数据,有的话
更新
没有新增,一般在service中先查询在判断,为解决高并发的问题在Sql中做...
设置 ON UPDATE CURRENT_TIMESTAMP,仅当
字段
值发生
改变
时,才会
更新
记录的时间
验证: 用了ON UPDATE CURRENT_TIMESTAMP后,update记录时,记录时间是不是一定会随
更新
时间而
改变
?
Gorm 只
更新
某一
字段
Gorm 只
更新
某一
字段
背景 在开发中,可能会遇到,需要
更新
这一条数据的某一
字段
,但是并不想修改其的UpdatedAt
字段
。 如:数据浏览量。 正常
更新
... err = d.db.Model(&repository.UserInfo{}).Where("id = ?", id).Update(repository.UserInfo{ ViewsCount: viewsCount+1, }).Error ... 只
更新
某一
字段
(UpdatedAt
字段
不会
更新
) ... err =
应用实例
27,579
社区成员
68,540
社区内容
发帖
与我相关
我的任务
应用实例
MS-SQL Server 应用实例
复制链接
扫一扫
分享
社区描述
MS-SQL Server 应用实例
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章