与插入 删除 相比 ,更新记录情况稍复杂一些。
我们如何更新记录呢?这里只讲一下用操作查询和客户端临时表两种方式更新记录:
一、操作查询
图1
图1 为数据库表voyty 表的一部分,现在假如我们要把红框处amount的值由97改为197,那么该如何办呢?
对sql语句略熟的人都马上会想到这样做:
- Set conn =createobject(“adodb.connection”)
- ……
- strSQL = " UPDATE VoyTY SET amount = 197 WHERE voy='北星横栈- 0001I / 0002O'"
- Conn.Execute strSQL, lrstaff, adExecuteNoRecords
复制代码
这样利用dml语句直接修改数据库是最为常用的方式,如果你的程序是单用户的,建议采取这种方式。
但是,采用sql数据库,你总会有写多用户使用程序的进候,如果是多用户程序呢?
考虑一下这种情境,你正在客户端浏览数据,发现红框处的值为97,你想把它改为197,但此时,另一个人也在浏览记录,在你要修改数据时,他先你一步把97改为了180,此时怎么办?
当然你可以在你浏览数据的时候,把表锁住,禁止别人修改,但这样失之于灵活,一般不推荐。
所以你现在就面临着如何处理两个人或者多个人修改数据冲突的情况。
1、假如你就是要把amount的值改为197,那么你可以执行:
- UPDATE VoyTY SET amount = 197 WHERE voy='北星横栈- 0001I / 0002O'
复制代码别人的修改会被覆盖,也就意味着以最后修改的人为准(就是说多个人都要改数据,谁最后提交,结果就是谁的)。
2、假如你是只有当amount为97时才修改(也就是以第一个修改的人为准),那么你可以执行:
- UPDATE VoyTY SET amount = 197 WHERE voy='北星横栈- 0001I / 0002O' and amount=97
复制代码
3、假如你不是想把值从97改到197,而是要在原值的基础上加100,你可以执行:
- UPDATE VoyTY SET amount = amount+100 WHERE voy='北星横栈- 0001I / 0002O'
复制代码
这样的话,也就意味着任何人的修改都会影响结果。
操作查询的问题之一是,假如别人修改了记录,你并不会知道,举个例子,当你执行:
- UPDATE VoyTY SET amount = 197 WHERE voy='北星横栈- 0001I / 0002O'
复制代码
别人修改了记录,你会覆盖别人的修改,但也许此时你想看一下别人把这个值改成了多少,
参考一下,再重新决定自己要修改的值,可操作查询并不会告诉你别人已经修改了这个值。
二、客户端临时表(待续)