Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да разменя стойностите на два реда в MySQL, без да нарушавате уникалното ограничение?

Не (нито един, за който се сещам).

Проблемът е как MySQL обработва актуализации. MySQL (за разлика от други СУБД, които прилагат UPDATE правилно), обработва актуализациите по нарушен начин. Той налага проверка на UNIQUE (и други) ограничения след всяка актуализация на отделен ред, а не - както би трябвало да се прави - след цялата UPDATE изявлението завършва. Ето защо нямате този проблем с (повечето) други СУБД.

За някои актуализации (като увеличаване на всички или някои идентификатори, id=id+1 ), това може да бъде решено с помощта на - друга нестандартна функция - ORDER BY в актуализацията.

За размяна на стойностите от два реда този трик не може да помогне. Ще трябва да използвате NULL или фалшива стойност (която не съществува, но е разрешена във вашата колона) и 2 или 3 израза.

Можете също така временно да премахнете уникалното ограничение, но не мисля, че това наистина е добра идея.

Така че, ако уникалната колона е цяло число със знак и няма отрицателни стойности, можете да използвате 2 оператора, обвити в транзакция:

START TRANSACTION ;
    UPDATE tasks 
    SET priority = 
      CASE
        WHEN priority = 2 THEN -3 
        WHEN priority = 3 THEN -2 
      END 
    WHERE priority IN (2,3) ;

    UPDATE tasks 
    SET priority = - priority
    WHERE priority IN (-2,-3) ;
COMMIT ;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Чудна и досадна грешка:Извикване на недефинирана функция mysql_query()

  2. ROW_NUMBER в SQL – Изберете Най-добър пример в SQL и SQL Server

  3. Достъпът е отказан за потребител 'root'@'localhost' с PHPMyAdmin

  4. Как да премахнете част от низ в mysql?

  5. Инсталиране на уеб сървър във FreeBSD 6.0 с Apache 2.2, MySQL 5.0 и PHP 5 – част 3