鉴于以下表结构,当找到重复的唯一索引时,如何将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
,然后通过更新行来完成更新查询它找到了。
答案 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)