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

列の値を別のレコードの同じ列と交換します

    単一の「スワップ」操作...

    SWAP(@ old_pos、@new_pos)

    UPDATE
      my_table
    SET
      position = CASE WHEN position = @old_pos THEN @new_pos ELSE @old_pos END
    WHERE
      position IN (@old_pos, @new_pos)
    


    ただし、これはスワップ操作のテーブルに簡単に拡張することはできません。これは、実際にはスワップが特定の順序で発生する必要がある場合に、すべてのスワップを一度に実行しようとするためです...


    また、SWAP(@id、@new_pos)を実行する場合は、更新するテーブルに対してサブクエリまたは自己結合を実行する必要があります。 MySQLはそれを好みません。制限を回避する方法はありますが、少し面倒になります...

    UPDATE
      my_table
    INNER JOIN
      (SELECT position AS old_pos, @new_pos AS new_pos FROM (SELECT position FROM my_table WHERE id = @id)) AS params
        ON my_table.position IN (params.old_pos, params.new_pos)
    SET
      myTable.position = CASE WHEN position = old_pos THEN new_pos ELSE old_pos END
    

    (私は考えます それはうまくいくでしょう)


    注:

    これらは両方とも、@ old_posと@new_pos、または@idと@new_posの両方が見つかったと想定し、チェックせず、 それらが存在しない場合は混乱させます。

    これは、トランザクションに入れ、ROW_COUNT()で更新されたレコードが1つだけであることが示された場合にロールバックすることで解決できます。



    1. SQL内部結合

    2. 選択されたデータを外部キーおよびSQLSTATE[23000]として挿入:整合性制約違反:1048

    3. 2つの異なるテーブルから金額を追加するOracle

    4. SQLでの行パターン認識