我有以下(简化)数据库表,代表锦标赛中的团队。每个团队属于一个游泳池,并且在该游泳池中具有等级(第一,第二等)。
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)分别在一个池中排名第一和第二。他们互相比赛,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在每行更改后检查唯一键。
在完成所有更改之后,有没有办法推迟唯一密钥检查?
答案 0 :(得分:0)
Rank是动态值,为什么要添加到唯一键?或者你的意思是一个池中不可能有两个相似的排名值?
当您更新数据时,会出现两个类似的pool_id,排名对 - 这就是原因。
删除唯一键:
ALTER TABLE team DROP INDEX pool_id_rank_idx