4

我有 ATM 卡的数据库,其中有字段 account_no、card_no、is_blocked、is_activated、issue_date 字段帐号和卡号不是唯一的,因为旧卡将过期并标记为 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
4

2 回答 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' 
于 2012-10-01T06:56:15.430 回答
5

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

(至少对我来说)令人惊讶的部分是它确实似乎是解析器问题,而不是引擎本身的问题,因为如果将子选择包装到派生表中,这确实有效:

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
                    )
于 2012-10-01T07:01:03.807 回答