トーナメントのチームを表す次の (単純化された) データベース テーブルがあります。各チームはプールに属し、そのプールでランク (1 位、2 位など) を持ちます。
CREATE TABLE `team` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`pool_id` bigint(20) NOT NULL,
`rank` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `pool_id_rank_idx` (`pool_id`,`rank`),
)
1 つのプールに同じランクの 2 つのチームを含めることはできないため、一意のキーが存在します。
チームが互いに対戦すると、ランクが変わるため、更新する必要があります。1 つのクエリですべてのランクを更新できるようにしたいのですが、「重複エントリ」エラーを発生させない方法がわかりません。この問題を引き起こす状況の例を次に示します。
2 つのチーム (A と B) がプールでそれぞれ 1 位と 2 位にランク付けされます。彼らはお互いに対戦し、B が A を打ち負かしました。今度は彼らのランクを切り替える必要があります。私が使用しているクエリは次のようなものです。
UPDATE team
SET rank = CASE id WHEN idA THEN 2 WHEN idB THEN 1 END
WHERE id IN (idA,idB);
idA と idB は、対応するチームの ID です。
これはうまくいくはずですが、次のエラーが発生します。
ERROR 1062 (23000): Duplicate entry '1-2' for key 'pool_id_rank_idx'
これは、各行が変更された後にMySQLが一意のキーをチェックするために発生すると思います.
すべての変更が完了するまで一意のキー チェックを延期する方法はありますか?