День добрый. Ребят, выручайте. Имеется таблица [sql]CREATE TABLE `tb` ( `ID` int(11) NOT NULL auto_increment, `aa` int(11) default NULL, PRIMARY KEY (`ID`) ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=cp1251 [/sql] Т.е. в ней всего два поля: уникальный ID и какие-то данные. Моя задача - обменять две строки друг с другом данными при сохранении ID. Допустим, в таблице две строки: (ID,aa): (1,1) и (2,2). Мне нужно сделать (1,2) и (2,1); Запрос [sql]UPDATE tb t1, tb t2 SET t1.aa=t2.aa, t2.aa=t1.aa WHERE t1.ID=1 AND t2.ID=2; [/sql]приводит к тому, что я получаю (1,2) и (2,2). Как мне добиться нужного результата?
Замечено одно обстоятельство. На моём локальном хосте в результате последнего запроса обновляются две строки. А на сервере хостера - одна строка. Очевидно, загвоздка где-то в одной из переменных MySQL. Только вот в какой?
а что мешает сначала получить данные, а потом растыкать в нужные строки? Запросов будет 1000 в секунду?
Всё дело в условии WHERE. Оно может обозначить очень большое количество строк, которые нужно изменить. Допустим, у меня есть дерево. 1 2 3 4 5 6 7 8 9 И мне нужно поменять узлы 2-го уровня местами, чтоб сначала был узел 3 со своими подузлами, а потом узел 2. Так вот, в одном запросе нужно менять местами сразу все подузлы одного дерева со всеми подузлами другого. У узлов (строк таблицы) меняются поля iLeft и iRight. Т.е. я пишу [sql]SET tb1.iLeft=iLeft-5, tb1.iRight=iRight-5, tb2.iLeft=iLeft+10, tb2.iRight=iRight+10 WHERE -- тут условие, которое определяет узлы таблиц tb1 и tb2.[/sql] tb1 и tb2 - это ссылки на одну и ту же таблицу. В общем, в моём случае нужно в одном запросе обменять данными две строки. И на одной MySQL базе это делается, а на другой - нет. Вопрос, из-за чего?
Т.е. на сервере InnoDB таблица ведет себя точно так же и меняет только одну строку? Ну тогда можно помедитировать над этим возможно причина в этом. И тогда соответственно решение тут Posted by Roger Morris on September 23 2008 4:04am или тут