我有以下(简化的)数据库表,代表锦标赛中的球队。每个团队都属于一个池,并且在该池中具有排名(第一、第二等)。
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`),
)
唯一的关键是在那里,因为一个池不能有两个具有相同排名的团队。
当团队互相比赛时,他们的排名会发生变化,我需要更新它们。我希望能够在一个查询中更新所有排名,但我想不出一种方法来做到这一点,它有时不会导致“重复条目”错误。以下是导致此问题的情况示例:
两支球队(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 在每行更改后检查唯一键。
有没有办法将唯一密钥检查推迟到所有更改完成后?