@Arik

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

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

Все работает пока нет уникального ключа.
Двумя запросами могу сделать, вопрос больше для развития, можно ли решить задачу одним запросом?
  • Вопрос задан
  • 148 просмотров
Решения вопроса 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
Чисто теоретически, уникальный ключ должен обеспечивать уникальность данных в каждый момент времени.
Эта уникальность проверяется после каждого изменения поля, к которому она применяется, и поскольку поля обновляются последовательно, целостность (с точки зрения ключа) нарушается.

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

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

Войти через центр авторизации
Похожие вопросы