За последние 24 часа нас посетили 18562 программиста и 1620 роботов. Сейчас ищут 1255 программистов ...

Проблема с UPDATE

Тема в разделе "MySQL", создана пользователем vober, 29 май 2010.

  1. vober

    vober Активный пользователь

    С нами с:
    29 май 2010
    Сообщения:
    7
    Симпатии:
    0
    День добрый.
    Ребят, выручайте.

    Имеется таблица
    [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).

    Как мне добиться нужного результата?
     
  2. vober

    vober Активный пользователь

    С нами с:
    29 май 2010
    Сообщения:
    7
    Симпатии:
    0
    Замечено одно обстоятельство.
    На моём локальном хосте в результате последнего запроса обновляются две строки.
    А на сервере хостера - одна строка.

    Очевидно, загвоздка где-то в одной из переменных MySQL. Только вот в какой?
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а что мешает сначала получить данные, а потом растыкать в нужные строки? Запросов будет 1000 в секунду?
     
  4. vober

    vober Активный пользователь

    С нами с:
    29 май 2010
    Сообщения:
    7
    Симпатии:
    0
    Всё дело в условии 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 базе это делается, а на другой - нет.
    Вопрос, из-за чего?
     
  5. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Смени таблицу с MyISAM на InnoDB
     
  6. vober

    vober Активный пользователь

    С нами с:
    29 май 2010
    Сообщения:
    7
    Симпатии:
    0
    Сменил. Только сервер по-прежнему изменяет только одну строку.
     
  7. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Т.е. на сервере InnoDB таблица ведет себя точно так же и меняет только одну строку?

    Ну тогда можно помедитировать над этим
    возможно причина в этом.

    И тогда соответственно решение тут
    Posted by Roger Morris on September 23 2008 4:04am
    или тут