如何一次更新多行,同时避免使用唯一键的问题?

时间:2012-05-30 01:41:09

标签: mysql

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

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

在完成所有更改之后,有没有办法推迟唯一密钥检查?

1 个答案:

答案 0 :(得分:0)

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

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

删除唯一键:

ALTER TABLE team DROP INDEX pool_id_rank_idx