日期:2014-05-17  浏览次数:20783 次

updata 语句,疑惑



drop  table test 
-- create table
create table test(
id  int,
is_error char
)
-- insert data
insert into test values(1, 'N')
commit
-- 修改出现在where 后面的字段。一直以为这样写是会出错的!!!
update test set is_error= 'Y' where  is_error= 'N'
--1 row updated,
select * from test
1, Y
-- 结果已经更改


头脑中修改出现在where 后面的字段,是不行的,  可是测试结果却没错,google结果也可以。

UPDATE test
SET object_name = 'LOAD'
WHERE object_name = 'DUAL';

然后又google 了sqlserver, 也可以,又在mysql 上测了下也可以, 今天在写一段sql的时候,第一反应就是这种写法,可是随即又否定了这种写法,结果多写了些代码, 把问题复杂化了. 
为什么我会有这种想法?印象中曾经这样写出过错。 但是在哪里碰到的呢?

顺便问问:updata语句的顺序:

先 updata 再where 把筛选后的结果集存放再临时表中, 然后set, 即给指定字段设特定值。然后再将临时表中的结果集merge到原表中,是这样的吗? 如果是的, 这个merge的过程具体是怎么实现的啊?  
update

------解决方案--------------------
可以把UPDATE理解为先DELETE,后INSERT
------解决方案--------------------
update之前必须要找到要update的记录,所以先要运行where语句。
另外一点儿好像就是oracle在update是系统内部会有一个new和old记录,分别记录update前后的值,就想在触发器中的那样
------解决方案--------------------
肯定先where啊,不然怎么知道你要干什么?