Апгрейд MySQL и переписывание запросов

Официальный логотип Mysql

Технически апгрейд базы MySQL несложен, но могут возникнуть не очевидные подводные камни. Например, если MySQL был 4-й версии, а после upgrade версия стала выше 5.0.11, то могут возникнуть проблемы с работой запросов, использующих LEFT JOIN.

Начиная с версии MySQL 5.0.12 запросы с JOIN обрабатываются по стандарту SQL:2003, поэтому такие запросы к базе придется переписать. Вот пример:

CREATE TABLE IF NOT EXISTS `t1` (
`id` int(10) unsigned NOT NULL auto_increment,
`type` enum('a','b') default NULL,
PRIMARY KEY (`id`),
KEY `type` (`type`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `t1` VALUES (1, 'a'), (2, 'a'), (3, 'b'), (4, 'a'), (5, 'b');

CREATE TABLE IF NOT EXISTS `t2` (
`t1_id` int(10) unsigned default NULL,
KEY `t1_id` (`t1_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `t2` VALUES (1), (1), (1), (2), (2);

CREATE TABLE IF NOT EXISTS `t3` (
`t1_id` int(10) unsigned default NULL,
KEY `t1_id` (`t1_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `t3` VALUES (1), (1), (2), (2), (3);

#Test 1
select t1.id
from t1, t2
left join t3 on t1.id = t3.t1_id and t1.type = 'a'
where t1.id = t2.t1_id
group by t1.id
#1054 - Unknown column 't1.id' in 'on clause'

#Test 2, swap the order of the conditions in "on"
select t1.id
from t1, t2
left join t3 on t1.type = 'a' and t1.id = t3.t1_id
where t1.id = t2.t1_id
group by t1.id
#1054 - Unknown column 't1.type' in 'on clause'

В MySQL 4.x запрос работает без ошибок, начиная с версии 5.0.12 запрос ругается на синтаксис. Если в эти запросы добавить скобок, все заработает:

select t1.id
from (t1, t2)
left join (t3) on (t1.id = t3.t1_id and t1.type = 'a')
where t1.id = t2.t1_id
group by t1.id

select t1.id
from (t1, t2)
left join (t3) on (t1.type = 'a' and t1.id = t3.t1_id)
where t1.id = t2.t1_id
group by t1.id