1

我有以下(简化的)数据库表,代表锦标赛中的球队。每个团队都属于一个池,并且在该池中具有排名(第一、第二等)。

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 在每行更改后检查唯一键。

有没有办法将唯一密钥检查推迟到所有更改完成后?

4

1 回答 1

0

排名是动态值,为什么要添加唯一键?或者你的意思是一个池不可能有两个相似的排名值?

当您更新数据时,会出现两个相似的 pool_id,rank 对 - 这就是原因。

删除唯一键:

ALTER TABLE team DROP INDEX pool_id_rank_idx

于 2012-05-30T02:02:59.447 回答