update test_1 set c=0,a=c

[复制链接]
查看11 | 回复9 | 2008-1-2 17:35:53 | 显示全部楼层 |阅读模式
update test_1 set c=0,a=c
源数据如下

a
b
c



1
a
9

2
b
8

3
c
7

4
d
6

5
e
5

6
f
4

7
g
3

8
h
2

9
i
1
执行后如下

9
a
0

8
b
0

7
c
0

6
d
0

5
e
0

4
f
0

3
g
0

2
h
0

1
i
0
update 这个顺序,才注意到,update test_1 set c=0,a=c
我原来以为,会a这列也全变0 的。后来想想
其实这个set 部分的顺序不重要,a=c,这个c是不是从undo段取值啊?
希望高手给个明白的解释,谢谢。
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
我知道不分先手顺序,我只是很好奇oracle是怎么实现这种不分顺序的。
比如快照个原表,然后 =右边的表达式从原表来?还是其他什么方式,我所不了解的,对undo理解还是不深刻,也许 =右边的表达式 是从undo取值。
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
本来就是这样的结果,
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
set a=c这里c的值还是没有更新前表中的数据
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
你这个其实和
insert into test select * from test的原理一样的 如果test表里面有数据的话
你觉得这样会陷入死循环吗,插入后的新数据又被查询出,把查询出的数据又插入。不会的,oracle没有这样处理,关于这点tom在他的新书oracle 9i10g编程艺术里有详细的说明
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
Update是把被更新的旧值放入回滚段,应该是这个道理。
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
原帖由 douqq 于 2008-9-2 10:09 发表
update test_1 set c=0,a=c
源数据如下

a
b
c



1
a
9

2
b
8

3
c
7

4
d
6

5
e
5

6
f
4

7
g
3

8
h
2

9
i
1
执行后如下

9
a
0

8
b
0

7
c
0

6
d
0

5
e
0

4
f
0

3
g
0

2
h
0

1
i
0
update 这个顺序,才注意到,update test_1 set c=0,a=c
我原来以为,会a这列也全变0 的。后来想想
其实这个set 部分的顺序不重要,a=c,这个c是不是从undo段取值啊?
希望高手给个明白的解释,谢谢。

这就是数据库的一个事务
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
不会。。。
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
原帖由 zhangfengh 于 2008-9-2 10:11 发表
c=0,a=c 不分先后顺序

回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
应该是“读已提交”的规则吧。
例:
abc

1a9
sql> update test_1 set c=0,a=c
oracle 把 a=1, b=a,c= 9 放到回滚段内。
a=c , a读取的是回滚段内的c=9--- 这样提交后a=9了?
c=0,这个应该好理解。
猜测的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行