Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak zamienić wartości dwóch wierszy w MySQL bez naruszania unikalnego ograniczenia?

Nie. (żadne, o czym bym nie pomyślał).

Problem polega na tym, jak MySQL przetwarza aktualizacje. MySQL (w przeciwieństwie do innych DBMS, które implementują UPDATE prawidłowo) przetwarza aktualizacje w zepsuty sposób. Wymusza sprawdzenie UNIQUE (i inne) ograniczenia po każdej aktualizacji wiersza, a nie - jak powinno być - po całej UPDATE oświadczenie się kończy. Dlatego nie masz tego problemu z (większością) innych DBMS.

W przypadku niektórych aktualizacji (takich jak zwiększenie wszystkich lub niektórych identyfikatorów, id=id+1 ), można to rozwiązać za pomocą - innej niestandardowej funkcji - ORDER BY w aktualizacji.

W przypadku zamiany wartości z dwóch wierszy ta sztuczka nie może pomóc. Będziesz musiał użyć NULL lub fałszywa wartość (która nie istnieje, ale jest dozwolona w Twojej kolumnie) i 2 lub 3 stwierdzenia.

Możesz także tymczasowo usunąć to ograniczenie, ale nie sądzę, żeby to był dobry pomysł.

Tak więc, jeśli unikalna kolumna jest liczbą całkowitą ze znakiem i nie ma wartości ujemnych, możesz użyć 2 instrukcji zawartych w transakcji:

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 — alias kolumny dynamicznej

  2. Jak wybrać wiele wierszy według wielokolumnowego klucza podstawowego w MySQL?

  3. Wybierz, gdzie liczba jednego pola jest większa niż jeden

  4. Jakie znaki należy zmienić, aby zapobiec wstrzykiwaniu (My)SQL?

  5. Czy jest wymawiane jako „S-Q-L” czy „Sequel”?