Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara menukar nilai dua baris di MySQL tanpa melanggar batasan unik?

Tidak. (tidak ada yang bisa saya pikirkan).

Masalahnya adalah bagaimana MySQL memproses pembaruan. MySQL (berbeda dengan DBMS lain yang mengimplementasikan UPDATE dengan benar), memproses pembaruan dengan cara yang rusak. Ini memberlakukan pemeriksaan UNIQUE (dan lainnya) kendala setelah setiap pembaruan baris dan tidak - seperti yang seharusnya dilakukan - setelah UPDATE keseluruhan pernyataan selesai. Itulah mengapa Anda tidak mengalami masalah ini dengan (sebagian besar) DBMS lainnya.

Untuk beberapa pembaruan (seperti meningkatkan semua atau beberapa id, id=id+1 ), ini dapat diselesaikan dengan menggunakan - fitur non-standar lainnya - ORDER BY dalam pembaruan.

Untuk menukar nilai dari dua baris, trik itu tidak membantu. Anda harus menggunakan NULL atau nilai palsu (yang tidak ada tetapi diperbolehkan di kolom Anda) dan 2 atau 3 pernyataan.

Anda juga dapat menghapus batasan unik untuk sementara, tetapi menurut saya itu bukan ide yang bagus.

Jadi, jika kolom unik adalah bilangan bulat bertanda dan tidak ada nilai negatif, Anda dapat menggunakan 2 pernyataan yang digabungkan dalam sebuah transaksi:

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. membuat nomor acak menggunakan MYSQL

  2. Mencari susunan MySQL yang tidak peka huruf besar-kecil di mana a !=

  3. Array nilai meta serial WooCommerce di tabel wp_postmeta

  4. MySQL - mengambil nilai dari tabel lain jika kolomnya nol

  5. bagaimana cara memilih maksimum kolom string/int campuran?