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