まず最初に、その複数列の主キーはおそらく悪い考えです。ご存知のように、個々のフィールドを操作することは困難です。そのテーブルに自動インクリメントのbigint列を追加する必要があります。これが新しい主キーになり、代わりに3列の一意性制約を一意のインデックスにすることができます。パフォーマンスが向上するはずです...しかし、必要な種類の操作も可能になります。変更を実行できますが、整数インデックスによって元の行を識別できます。
そうすれば、作業用の一時テーブルを作成してもかまわない限り、「1回限りの更新」を安全に実行できるようになります。このようなもの:
同じスキーマを使用して、一意のを使用せずに、いくつかの一時テーブルを作成します。 3列のインデックス-実行しようとしているクエリに役立つため、一意でないインデックスを作成できます。
処理する必要のあるレコードを最初のテーブルにコピーします(一意の整数の主キーを含む)。
すべてのdetail
を更新します 一時テーブルで更新する必要のある列;
INSERT ... SELECT
を使用します SUM
を使用 およびGROUP BY
それらのレコードを2番目のテーブルにマージします。
INSERT INTO temp2 (...whatever...) SELECT ...whatever..., SUM(no) FROM temp1 GROUP BY ...whatever...
最後に、元のテーブルからtemp1テーブルのすべてのレコードを削除し(整数の主キーを使用)、temp2テーブルのレコードを元のテーブルに挿入します。