UPDATE语句中WHERE子句中的子查询

4

我有一个ATM卡片的数据库,其中包含账户号、卡号、是否被锁定、是否激活和发行日期等字段。账户号和卡号字段不是唯一的,因为旧卡会过期并标记为is_block=Y,新的记录将插入到具有相同卡号、账户号的新行中,is_blocked=N。现在,我需要通过issue_date更新is_blocked/is_activated。

UPDATE card_info set is_blocked='Y' where card_no='6396163270002509' 
AND opening_date=(SELECT MAX(opening_date) FROM card_info WHERE card_no='6396163270002509')
但它不允许我这样做,它会抛出以下错误。
1093 - You can't specify target table 'card_info' for update in FROM clause
2个回答

5

试试这个:

UPDATE card_info ci
INNER JOIN 
(
  SELECT card_no, MAX(opening_date) MaxOpeningDate
  FROM card_info
  GROUP BY card_no
) cm ON ci.card_no = cm.card_no AND ci.opening_date = cm.MaxOpeningDate
SET ci.is_blocked='Y' 
WHERE ci.card_no = '6396163270002509' 

MySQL有很多愚蠢的限制,其中之一就是这个。你的解决方案可行。 - stamster

5

这是MySQL解析器的一个愚蠢限制之一。通常解决此问题的方法是使用Mahmoud所示的JOIN查询。

令人惊讶的部分(至少对我来说)是,这似乎真的是一个解析器问题,而不是引擎本身的问题,因为如果将子查询包装到派生表中,它可以正常工作:

UPDATE card_info 
   SET is_blocked='Y' 
 WHERE card_no = '6396163270002509' 
 AND opening_date = ( select max_date 
                      from (
                          SELECT MAX(opening_date) as_max_date 
                          FROM card_info 
                          WHERE card_no='6396163270002509') t
                    )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,