Неустановленная пользовательская переменная обрабатывается как NULL
, если вы ссылаетесь на нее в выражении.
В SQL NULL
+ 1 возвращает NULL
. Если вы не установите для @sort
значение, отличное от NULL
, до этого UPDATE
, тогда оно останется равным NULL
независимо от того, сколько раз вы оцениваете @sort:=@sort+1
. Как только вы сделаете @sort:=0
, он должен нормально увеличиваться.
Попробуйте это, не делая этого в UPDATE
:
mysql> set @sort := NULL;
mysql> SELECT @sort; -- returns NULL
mysql> set @sort := @sort + 1;
mysql> SELECT @sort; -- returns NULL again
mysql> set @sort := 0;
mysql> set @sort := @sort + 1;
mysql> SELECT @sort; -- returns 1
Полагаю, это просто совпадение, что у вас нет дубликатов после того, как вы в первый раз установили @sort:=0
.
edit: Вышеприведенное верно, но, как вы заметили, оно не объясняет поведение, которое вы видите, поскольку логически @sort
должно быть гарантировано установлено равным 0 во время оценки первого строка.
Тем не менее, я замечаю, что если я изменю порядок терминов в выражении IF()
, все будет работать, даже если @sort
не установлено, когда мы начинаем:
set @last='';
-- set @sort=NULL;
update conf_profile set sort=
if(
@last!=(@last:=concat(org_id,',',profile_type_id,',',page,',',col)),
(@sort:=0),
(@sort:=@sort+1)
)
order by org_id,profile_type_id,page,col,sort,id;
Я не уверен, что понимаю это достаточно хорошо, чтобы объяснить, почему это работает, но есть некоторые причудливые вещи, касающиеся оценки пользовательских переменных. В этом блоге вы найдете множество примеров и подробностей: " Продвинутые методы пользовательских переменных MySQL ".