sql >> データベース >  >> RDS >> Mysql

一意の制約に違反せずにMySQLの2つの行の値を交換するにはどうすればよいですか?

    いいえ。 (私が考えることのできるものはありません。)

    問題は、MySQLが更新を処理する方法です。 MySQL(UPDATEを実装する他のDBMSとの違い 適切に)、壊れた方法で更新を処理します。 UNIQUEのチェックを強制します (およびその他の)すべての行の更新後の制約であり、UPDATE全体の後ではありません。 ステートメントが完了します。そのため、(ほとんどの)他のDBMSではこの問題は発生しません。

    一部の更新(すべてまたは一部のIDの増加など、id=id+1 )、これは、別の非標準機能であるORDER BYを使用して解決できます。 アップデートで。

    2つの行の値を交換する場合、そのトリックは役に立ちません。 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. MySQLでのMATCH()関数のしくみ

    2. OracleトリガーORA-04098:トリガーが無効であり、再検証に失敗しました

    3. 掲示板-データベースの最適化

    4. 実行時にユーザーから入力を取得する方法