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

制限付きのMySQLバッチクエリ

    次の方法は、possessionsという事実に依存しています テーブルには主キーとcitizen_idがあります その一部ではありません。アイデアは次のとおりです:

    1. 更新のすべてのパラメーターを入力します(citizen_id およびgood_id フィルタリングするには、citizen_idの新しい値 および更新する行数)をストレージ、専用テーブル、または一時テーブルに追加します。

    2. 行番号をpossessionsに割り当てます (citizen_id, good_id)での行の分割 次に、ランク付けされた行セットをパラメータテーブルに結合して、citizen_idで元のフルセットをフィルタリングします。 およびgood_id 、および行数。

    3. possessionsに参加する 主キー値の前回の結合の結果とcitizen_idの更新 新しい値で。

    MySQLのSQLでは、上記は次のようになります。

    UPDATE possessions AS p
    INNER JOIN
    (
      SELECT
        @r := @r * (@c = p.citizen_id AND @g = p.good_id) + 1 AS r,
        p.possession_id,
        @c := p.citizen_id AS citizen_id,
        @g := p.good_id AS good_id
      FROM
        possessions AS p
      CROSS JOIN
        (SELECT @r := 0, @c := 0, @g := 0) AS x
      ORDER BY
        p.citizen_id,
        p.good_id
    ) AS f ON p.possession_id = f.possession_id
    INNER JOIN
      possession_updates AS u ON u.citizen_id = f.citizen_id AND u.good_id = f.good_id
    SET
      p.citizen_id = u.new_citizen_id
    WHERE
      f.r <= u.row_count
    ;
    

    possessions_update パラメータ値を含むテーブルです。

    クエリは、変数を使用する既知の行番号付け方法を使用します。これは、fに実装されています。 サブクエリ。

    私はMySQLを持っていないので、パフォーマンスの観点からこれを適切にテストすることはできませんが、少なくともこのSQLFiddleデモ メソッドが機能すること。 (SQL FiddleではMySQLの右側のスクリプトでデータ変更ステートメントが許可されていないため、UPDATEステートメントはスキーマスクリプトに含まれています。右側では、possessionsのUPDATE後の内容が返されるだけです。 。)




    1. ローカルのmysqlサーバーをAWSに移行しようとしています

    2. SQL Server 2016:データベースユーザーを作成する

    3. SQLテーブルの列を分割する方法

    4. mysqlピボット-同じテーブルから異なる列にデータをフェッチするにはどうすればよいですか?