Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте!
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;
И вдруг теперь этот запрос выполняется слева на право.
Неужели так странно работает оптимизатор запросов, что на его решение о порядке присвоения влияет не только последовательность таблиц в списке обновляемых, но и количество строк в таблицах? а может это баг?
Неактивен
вряд ли это ещё актуально, но лучше позже чем никогда
mysql делает join таблиц методом вложенных циклов, при этом на первое место он старается ставить таблицу с меньшим кол-вом строк. можно сказать ожидаемое поведение
Неактивен