mysql, как сделать магазин "вставка при обновлении дубликата ключа" пред. ценности? - PullRequest
2 голосов
/ 23 августа 2011

Почему для такой таблицы:

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);

1 Ответ

4 голосов
/ 23 августа 2011

UPDATE обновляет значения последовательно (как в UPDATE, так и в операторе DUPLICATE UPDATE). Это означает, что если вы ссылаетесь на значение в вашем операторе обновления, которое было обновлено в том же операторе, вы получите обновленное значение, а не исходное.

Из-за этого в утверждении

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

значение0 всегда равно значениям (значение0) - это были обновления в предыдущей части оператора обновления. Чтобы заставить его работать так, как вы ожидаете, вы должны поменять позиции операторов:

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