@Arik

Можно ли поменять местами значения уникального поля одним запросом MySQL?

Есть простая таблица, например, users. У таблицы есть уникальный ключ на поле, например, email.
Можно ли одним запросом поменять значения?
Получилось что-то вроде:
UPDATE `users` 
SET `email` = CASE `email` WHEN ":email1" THEN ":email2" ELSE ":email1" END
WHERE `email` IN (":email1", ":email2")

Все работает пока нет уникального ключа.
Двумя запросами могу сделать, вопрос больше для развития, можно ли решить задачу одним запросом?
  • Вопрос задан
  • 164 просмотра
Решения вопроса 1
Нельзя.

Можно обернуть в транзакцию два запроса и использовать какие-то временные значения для уникальных ключей. Например, дописывать им в начале 4 пробела:
START TRANSACTION ;
    UPDATE users 
    SET email = 
      CASE
        WHEN email = :email1 THEN CONCAT('    ', :email2) 
        WHEN email = :email2 THEN CONCAT('    ', :email1) 
      END 
    WHERE email IN (:email1,:email2) ;

    UPDATE users 
    SET email = LTRIM(email)
    WHERE email IN (CONCAT('    ', :email1), CONCAT('    ', :email2));
COMMIT ;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Draconian
Oracle Developer
Чисто теоретически, уникальный ключ должен обеспечивать уникальность данных в каждый момент времени.
Эта уникальность проверяется после каждого изменения поля, к которому она применяется, и поскольку поля обновляются последовательно, целостность (с точки зрения ключа) нарушается.

Т.е. одним запросом такое сделать не получится.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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