t********5 发帖数: 274 | 1 问个弱问题,
只有在conditionA的情况下,更新column2,否则不更新,不想把IF写在update外边,
按照我下边的样子,能实现吗
update tableA
set column1 ='aaa',
if(conditionA)
set column2='bbb',
else
do not update column2
end
set column3='sdfd',
....... |
a9 发帖数: 21638 | 2 你这是口语,计算机识别不了吧?
分两个sql语句执行不就得了。
或者用case
【在 t********5 的大作中提到】 : 问个弱问题, : 只有在conditionA的情况下,更新column2,否则不更新,不想把IF写在update外边, : 按照我下边的样子,能实现吗 : update tableA : set column1 ='aaa', : if(conditionA) : set column2='bbb', : else : do not update column2 : end
|
c*******e 发帖数: 8624 | 3 update tableA
set column2 = case ...
【在 t********5 的大作中提到】 : 问个弱问题, : 只有在conditionA的情况下,更新column2,否则不更新,不想把IF写在update外边, : 按照我下边的样子,能实现吗 : update tableA : set column1 ='aaa', : if(conditionA) : set column2='bbb', : else : do not update column2 : end
|
B*****g 发帖数: 34098 | 4 col2上没有trigger行,有trigger就不一样了
边,
【在 c*******e 的大作中提到】 : update tableA : set column2 = case ...
|
i****a 发帖数: 36252 | 5 say say 有trigger what happens?
【在 B*****g 的大作中提到】 : col2上没有trigger行,有trigger就不一样了 : : 边,
|
B*****g 发帖数: 34098 | 6 一般来说大家就是写
update tabA set col2 = CASE when conditionA then 'AAA' else col2 end
但是要求是当非conditionA时不update,上面这个只实现了非conditionA时col2值不变。
假如说col2上有trigger当update时,把tabA的record复制到tabB中,不update col2就
不会复制,而update col2=col2就会复制。
【在 i****a 的大作中提到】 : say say 有trigger what happens?
|
i****a 发帖数: 36252 | 7 I am always curious, is update xxxtable set col2 = col2 really an update.
curious on 2 levels. on the query execution level, is it really a
transaction, or does it set off trigger
on disk IO level, does it cause disk activity.
变。
【在 B*****g 的大作中提到】 : 一般来说大家就是写 : update tabA set col2 = CASE when conditionA then 'AAA' else col2 end : 但是要求是当非conditionA时不update,上面这个只实现了非conditionA时col2值不变。 : 假如说col2上有trigger当update时,把tabA的record复制到tabB中,不update col2就 : 不会复制,而update col2=col2就会复制。
|
k********e 发帖数: 702 | 8 in MySQL it won't update.
【在 i****a 的大作中提到】 : I am always curious, is update xxxtable set col2 = col2 really an update. : curious on 2 levels. on the query execution level, is it really a : transaction, or does it set off trigger : on disk IO level, does it cause disk activity. : : 变。
|
y****w 发帖数: 3747 | 9 如果conditionA是全局的,写到外面会更好,false的时候不带c2玩就是了。很多时候
代码看起来多一点也未必是坏事,没必要任何时候都要求一句话解决。没有牺牲速度,
还可能避免很多麻烦。
写到一句里面就是case。
【在 t********5 的大作中提到】 : 问个弱问题, : 只有在conditionA的情况下,更新column2,否则不更新,不想把IF写在update外边, : 按照我下边的样子,能实现吗 : update tableA : set column1 ='aaa', : if(conditionA) : set column2='bbb', : else : do not update column2 : end
|
B*****g 发帖数: 34098 | 10 Oracle will fire the trigger, usually need to add WHEN clause to the trigger
.
I do know much about mysql.
how about
update xxxtable set col2 = col2||''
update xxxtable set col2 = col2, col3=col3
update xxxtable set col2 = col2, col3=col2
update xxxtable set col2 = CASE WHEN 1=1 THEN col2 ELSE col3 END
【在 k********e 的大作中提到】 : in MySQL it won't update.
|
|
|
B*****g 发帖数: 34098 | 11 a simple question finally become complicate, haha
【在 y****w 的大作中提到】 : 如果conditionA是全局的,写到外面会更好,false的时候不带c2玩就是了。很多时候 : 代码看起来多一点也未必是坏事,没必要任何时候都要求一句话解决。没有牺牲速度, : 还可能避免很多麻烦。 : 写到一句里面就是case。
|
B*****g 发帖数: 34098 | 12 I will check the I/O later in Oracle.
But I really doubt it will not physical update. I am think always update is
much simpler for the database.
【在 i****a 的大作中提到】 : I am always curious, is update xxxtable set col2 = col2 really an update. : curious on 2 levels. on the query execution level, is it really a : transaction, or does it set off trigger : on disk IO level, does it cause disk activity. : : 变。
|
a9 发帖数: 21638 | 13 倒不一定,对于现在优化到极致的数据库来说,能少一次i/o就会尽量少一次,要不然
,咱去给o/m提提意见去?
is
【在 B*****g 的大作中提到】 : I will check the I/O later in Oracle. : But I really doubt it will not physical update. I am think always update is : much simpler for the database.
|
B*****g 发帖数: 34098 | 14 问题还是挺多的. 比如说
怎样区分col2=col2, col2=col2||'' 和 col2='AAA' (if col2 value is 'AAA').
如果update10行,一行变了,9行没变怎么办?
还要不要fire trigger?
....
完了,再下去tom kyte来都不够用了。
【在 a9 的大作中提到】 : 倒不一定,对于现在优化到极致的数据库来说,能少一次i/o就会尽量少一次,要不然 : ,咱去给o/m提提意见去? : : is
|
a9 发帖数: 21638 | 15 要我设计的话,首先我会触发触发器。
因为触发了触发器,就会需要inserted/deleted表,这样,我就会比较一下更新前后数
据是否一致。
如果一致,就不写磁盘,如果不一致,就写。
不然
【在 B*****g 的大作中提到】 : 问题还是挺多的. 比如说 : 怎样区分col2=col2, col2=col2||'' 和 col2='AAA' (if col2 value is 'AAA'). : 如果update10行,一行变了,9行没变怎么办? : 还要不要fire trigger? : .... : 完了,再下去tom kyte来都不够用了。
|
a9 发帖数: 21638 | 16 如果没有触发器,还会生成这两个表吗?
【在 a9 的大作中提到】 : 要我设计的话,首先我会触发触发器。 : 因为触发了触发器,就会需要inserted/deleted表,这样,我就会比较一下更新前后数 : 据是否一致。 : 如果一致,就不写磁盘,如果不一致,就写。 : : 不然
|
B*****g 发帖数: 34098 | 17 Cannot check I/O now.
update col = col, SQL%ROWCOUNT in oracle is not 0
and those records are locked if no commit.
【在 a9 的大作中提到】 : 如果没有触发器,还会生成这两个表吗?
|
B*****g 发帖数: 34098 | 18 when you have inserted/deleted表, 已经写磁盘了吧
【在 a9 的大作中提到】 : 要我设计的话,首先我会触发触发器。 : 因为触发了触发器,就会需要inserted/deleted表,这样,我就会比较一下更新前后数 : 据是否一致。 : 如果一致,就不写磁盘,如果不一致,就写。 : : 不然
|
a9 发帖数: 21638 | 19 还没有吧,transaction还没有commit呐?
后数
【在 B*****g 的大作中提到】 : when you have inserted/deleted表, 已经写磁盘了吧
|
a9 发帖数: 21638 | 20 那看来是用了最简单的方法:写
【在 B*****g 的大作中提到】 : Cannot check I/O now. : update col = col, SQL%ROWCOUNT in oracle is not 0 : and those records are locked if no commit.
|
|
|
m***i 发帖数: 2480 | 21 update tableA
set Column1='aaa'
where (condition='True')
【在 t********5 的大作中提到】 : 问个弱问题, : 只有在conditionA的情况下,更新column2,否则不更新,不想把IF写在update外边, : 按照我下边的样子,能实现吗 : update tableA : set column1 ='aaa', : if(conditionA) : set column2='bbb', : else : do not update column2 : end
|
B*****g 发帖数: 34098 | 22 NND, wrong again, correct it.
I think I am talking about undo segment.
【在 a9 的大作中提到】 : 还没有吧,transaction还没有commit呐? : : 后数
|
t********5 发帖数: 274 | 23 我这小问题没想到被展开了复杂的讨论。。。
我就想代码整洁点,写到一个sql里,case when不行的,因为我在conditionA不成立的
时候不想改变column2的值。。。
而set column2=case when的话,conditionA = false的时候column2会被设成空。。。
我发帖时已经写成两个sql先用着了 |
B*****g 发帖数: 34098 | 24 it seems you still not get waht we are talking about. I believe I have post
the code for you.
***********************************************************
发信人: Beijing (中国万岁,北京加油), 信区: Database
标 题: Re: 问个简单的sql语句
发信站: BBS 未名空间站 (Thu Jan 27 20:29:15 2011, 美东)
一般来说大家就是写
update tabA set col2 = CASE when conditionA then 'AAA' else col2 end
但是要求是当非conditionA时不update,上面这个只实现了非conditionA时col2值不变。
假如说col2上有trigger当update时,把tabA的record复制到tabB中,不update col2就
不会复制,而update col2=col2就会复制。
***********************************************************
【在 t********5 的大作中提到】 : 我这小问题没想到被展开了复杂的讨论。。。 : 我就想代码整洁点,写到一个sql里,case when不行的,因为我在conditionA不成立的 : 时候不想改变column2的值。。。 : 而set column2=case when的话,conditionA = false的时候column2会被设成空。。。 : 我发帖时已经写成两个sql先用着了
|
t********5 发帖数: 274 | 25 哦,明白了,多谢!
post
变。
【在 B*****g 的大作中提到】 : it seems you still not get waht we are talking about. I believe I have post : the code for you. : *********************************************************** : 发信人: Beijing (中国万岁,北京加油), 信区: Database : 标 题: Re: 问个简单的sql语句 : 发信站: BBS 未名空间站 (Thu Jan 27 20:29:15 2011, 美东) : 一般来说大家就是写 : update tabA set col2 = CASE when conditionA then 'AAA' else col2 end : 但是要求是当非conditionA时不update,上面这个只实现了非conditionA时col2值不变。 : 假如说col2上有trigger当update时,把tabA的record复制到tabB中,不update col2就
|
y****w 发帖数: 3747 | 26 but need comparsion before physical update. not acceptable sometimes as it is out of normal sense as you are supposed to update something to be
different.
what you proposed earlier today for the dbms will more likely to be a performance disaster...
80/20,80/20....
【在 a9 的大作中提到】 : 倒不一定,对于现在优化到极致的数据库来说,能少一次i/o就会尽量少一次,要不然 : ,咱去给o/m提提意见去? : : is
|
B*****g 发帖数: 34098 | 27 good。
希望你在这个sql外还学到了其他东东。
col2就
【在 t********5 的大作中提到】 : 哦,明白了,多谢! : : post : 变。
|
a9 发帖数: 21638 | 28 关键问题是这个select是不是必须的。
如果有触发器,基本就是必须的,否则deleted表里的数据哪里来。
it is out of normal sense as you are supposed to update something to be
performance disaster...
不然
【在 y****w 的大作中提到】 : but need comparsion before physical update. not acceptable sometimes as it is out of normal sense as you are supposed to update something to be : different. : : what you proposed earlier today for the dbms will more likely to be a performance disaster... : 80/20,80/20....
|
y****w 发帖数: 3747 | 29 I don't think trigger is so common though;) even trigger exists, the
deleted/(or old table/new table)/sth. else
for different DBMS normally works on row, right?
【在 a9 的大作中提到】 : 关键问题是这个select是不是必须的。 : 如果有触发器,基本就是必须的,否则deleted表里的数据哪里来。 : : it is out of normal sense as you are supposed to update something to be : performance disaster... : 不然
|
a9 发帖数: 21638 | 30 就是不知道有没有trigger的时候,会不会有这些表。
你处理多少行,delted表里就有多少记录啊。关键是访问的时候先生成还是select一条
生成一条。
【在 y****w 的大作中提到】 : I don't think trigger is so common though;) even trigger exists, the : deleted/(or old table/new table)/sth. else : for different DBMS normally works on row, right?
|