SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 15.02.2012 05:18:35

Lioha
Участник
Зарегистрирован: 24.11.2010
Сообщений: 22

меняется порядок присвоения в multiple UPDATE

Здравствуйте!
MySql 5.1.53
есть 2 одинаковые таблицы:

CREATE TABLE `z1` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `a` int(10) unsigned NOT NULL DEFAULT '0',
  `b` int(10) unsigned NOT NULL DEFAULT '0',
  `prim` varchar(15) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

CREATE TABLE `z2` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `a` int(10) unsigned NOT NULL DEFAULT '0',
  `b` int(10) unsigned NOT NULL DEFAULT '0',
  `prim` varchar(15) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

в таблице z1 2 строки:
1;0;0;''
2;0;0;''

в таблице z2 1 строка:
1;0;0;''

если выполняю множественный update:
update z2,z1 set z2.a=100,z1.a=z1.a+z2.a where z2.id=1 and z1.id=z2.id
то присвоения выполнились слева на право, т.е. стало z2.a=100 и z1.a=100
(теперь привожу таблицы к первоначальному виду a=0)
и если теперь выполняю множественный update:
update z1,z2 set z1.a=100,z2.a=z2.a+z1.a where z1.id=1 and z1.id=z2.id;
то в этот раз получается порядок присваения справа на лево, т.е. стало z2.a=0 и z1.a=100

Хм, да, вроде MySql в мануале и не обещал в множественном update присвоения слева на право, но ведь все одинакого и таблицы и запросы...

И вот самое интересное. Если теперь добавить в таблицу z2 еще одну строку 2;0;0;''. Т.е. теперь таблицы одинаковы и по количеству строк стали
(теперь привожу таблицы к первоначальному виду a=0)
выполняю update z1,z2 set z1.a=100,z2.a=z2.a+z1.a where z1.id=1 and z1.id=z2.id;
И вдруг теперь этот запрос выполняется слева на право.

Неужели так странно работает оптимизатор запросов, что на его решение о порядке присвоения влияет не только последовательность таблиц в списке обновляемых, но и количество строк в таблицах? а может это баг?

Неактивен

 

#2 12.04.2016 17:40:54

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: меняется порядок присвоения в multiple UPDATE

вряд ли это ещё актуально, но лучше позже чем никогда smile

mysql делает join таблиц методом вложенных циклов, при этом на первое место он старается ставить таблицу с меньшим кол-вом строк. можно сказать ожидаемое поведение

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson