Задать вопрос

Поменять местами 2 строки в таблице mysql

Всем привет!

Есть таблица, например, с полями Id (int auto_increment) Name

Как с помощью sql запроса поменять местами Id у двух строк?

ЗЫ Хороших выходных :)
  • Вопрос задан
  • 12808 просмотров
Подписаться 4 Оценить Комментировать
Решения вопроса 1
UPDATE table SET priority=IF(priority=1, 2, 1) WHERE priority IN (1,2) — меняет местами order 1 и 2. order не должно быть уникальным, иначе 3 запроса.
Ответ написан
Пригласить эксперта
Ответы на вопрос 9
Zorkus
@Zorkus
И никто не спросил — а ЗАЧЕМ это нужно? sys-id на то и auto-increment, что выдается sequence-генератором раз и навсегда. Зачем вы хотите это сделать?
Ответ написан
приоритеты надо ставить с помощью специального поля в таблице, а id а то и id чтобы не нужно было его менять
Просто добавьте еще одно поле в таблицу типа priority и ему выставляйте нужные значения, а в программе у себя вместо ORDER BY id поставьте ORDER BY piority и ваша проблема решится
Ответ написан
Wott
@Wott
SQL не умеет менять сразу две строки одновременно, значить через третье значение.
Ответ написан
Комментировать
Cheese
@Cheese
если ld у вас не первичный ключ, но и одинаковых значений не содержит, то должно по идее сработать вот так (пусть нужно поменять местами номера 0 и 1)
UPDATE table SET ld=IF(ld=0, 1, IF(ld=1, 0, ld));
Ответ написан
Andryusha
@Andryusha
Поменяйте сначала id у одной из строк на какой-нибудь другой, потом поменяйте id второй строки на старый id первой строки, а потом поменяйте id первой строки на старый id второй строки.

UPDATE table SET ld=9999999 WHERE id = 1;
UPDATE table SET ld=1 WHERE id = 2;
UPDATE table SET ld=2 WHERE id = 9999999;

При этом собъется значение auto increment для id но его можно ручками поменять на нужный через ALTER TABLE.

Или вам принципиально одним запросом? Думаю что нет.
Ответ написан
Комментировать
@pwlnw
Хороший повод открыть для себя транзакции в СУБД.
Ответ написан
Комментировать
Zorkus
@Zorkus
Ок, с этим разобрались, теперь по другому спрошу.

Есть таблица, поле приоритета вынесено в отдельную колонку. Вы хотите поменять приоритет у записей А и Б. Именно поменять местами, засвопить. Вопрос — зачем? Какой бизнес-смысл в такой смене приоритета?
Ответ написан
Zorkus
@Zorkus
Хм. Т.е. вы хотите по сути хранить код в БД? строка кода = строка в таблице в базе? И приоритетты вам нужны, чтобы потом запросом выбирать эти строки так, чтобы они образовывали правильный кусок кода?
Ответ написан
@roodz
Допустим, у нас есть таблица участников матчей participants с полями (id, match_id, position).
Необходимо поменять местами участников матча.
Для наглядности добавим в неё поле name, которое хранит исходное сочетание match_id-position
Уникальность установлена по полям match_id+position.

Запрос:
INSERT INTO participants (`id`, `position`, match_id) 
VALUES (4, 0, 2), (3, 2, 2), (4, 1, 2) 
ON DUPLICATE KEY UPDATE `position` = VALUES(`position`)

Результат:
5de39554ce6c5568387039.png
Работает без снятия уникальности, одним запросом!
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы