1

トーナメントのチームを表す次の (単純化された) データベース テーブルがあります。各チームはプールに属し、そのプールでランク (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が一意のキーをチェックするために発生すると思います.

すべての変更が完了するまで一意のキー チェックを延期する方法はありますか?

4

1 に答える 1

0

ランクは動的な値ですが、なぜ一意のキーに追加したのですか? それとも、2 つの類似したランク値が 1 つのプールに存在することはあり得ないということですか?

データを更新すると、2 つの似たような pool_id とランクのペアが表示されます。これがその理由です。

一意のキーを削除:

ALTER TABLE team DROP INDEX pool_id_rank_idx

于 2012-05-30T02:02:59.447 に答える