2011-08-23 75 views
2

为什么对表是这样的:mysql,如何使'在重复密钥更新上插入'存储prev。值?

create table tbl (
    id int not null auto_increment, 
    key1 int not null, 
    key2 int not null, 
    value0 double, 
    value1 double, 
    key(id), 
    unique(key1,key2) 
); 

下面的查询是不存储分组。更新现有记录时,“value0”值为“value1”?它有可能吗?

insert into tbl (key1, key2, value0, value1) 
values (...), (...) 
, ... 
, (...) 
on duplicate key update value0=values(value0), value1=if(value0<>values(value0),value0, value1); 
+0

您要达到的目标是什么?以前的价值是什么意思?也许你需要插入ingore,而不是插入...重复密钥更新? –

+0

忘记在create table语句中描述键值,抱歉。现在更清楚了吗? – d0rc

+0

也许你只需要切换你的更新语句:重复键更新value1 = if(value0 <> values(value0),value0,value1),value0 = values(value0); –

回答

4

UPDATE按顺序更新值(都在UPDATE和DUPLICATE UPDATE语句中)。 这意味着如果您在更新语句中引用了一个值,该语句在同一个语句中进行了更新,您将获得更新的值,而不是原来的值。

在声明中

on duplicate key update value0=values(value0), value1=if(value0<>values(value0),value0, value1); 

value0总是equeals到值(value0)

正因为如此 - 它是在更新语句的前面部分的更新。要使其按照您的预期工作,您必须切换报表的位置:

on duplicate key update value1=if(value0<>values(value0),value0, value1), value0=values(value0);