MySQL:如何更新重复唯一键上的唯一键

时间:2013-12-24 01:51:17

标签: mysql

鉴于以下表结构,当找到重复的唯一索引时,如何将primary的值更改为0?

CREATE TABLE `ncur` (
    `user_id` INT NOT NULL,
    `rank_id` INT NOT NULL,
    `primary` TINYINT DEFAULT NULL,
    PRIMARY KEY (`user_id`, `rank_id`),
    UNIQUE (`user_id`, `primary`)
);

所以,当我运行这样的查询时:

UPDATE `ncur` SET `primary` = 1 WHERE `user_id` = 4 AND `rank_id` = 5;

user_id-primary的约束匹配时,我希望它将primary的所有user_id值设置为NULL,然后通过更新行来完成更新查询它找到了。

1 个答案:

答案 0 :(得分:1)

我对MySQL的熟悉程度不如Oracle;但是,我认为此查询应该适合您:

UPDATE `ncur` a
SET `primary` = (

    /* 1st Subquery */
    SELECT 1 FROM (SELECT * FROM `ncur`) b        
    WHERE b.`user_id` = a.`user_id` AND b.`rank_id` = a.`rank_id` 
                                                           AND a.`rank_id` = 5

    UNION ALL 

    /* 2nd Subquery */ 
    SELECT 0 FROM (SELECT * FROM `ncur`) b
    WHERE b.`user_id` = a.`user_id` AND b.`rank_id` <> 5 AND a.`rank_id` <> 5
    GROUP BY `user_id`
    HAVING COUNT(*) = 1
) 
WHERE `user_id` = 4

理由:

查询会更新所有user_id = 4

的记录

对于每个此类记录,primary设置为不同的值1,0或NULL,具体取决于此记录中rank_id的值以及有关其他数量的信息表中存在具有相同user_id的记录。

返回primary值的子查询由三个子查询组成,其中只有一个子查询根据具体情况返回一个值。

  • 第一个子查询:此子查询返回1的记录rank_id = 5;否则返回NULL

  • 第二个子查询:如果表中只有一个这样的记录,则此子查询返回0以显示rank_id != 5的记录;否则返回NULL

请注意:如果在没有rank_id = 5的记录的情况下运行查询,它仍将根据上面指定的规则更新其他记录。如果不需要,则必须从以下位置更改父查询中的条件:

WHERE `user_id` = 4 

为:

WHERE `user_id` = 4 AND 
      EXISTS(SELECT * FROM (SELECT * FROM `ncur`) b WHERE 'rank_id` = 5)