我有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
答案 0 :(得分: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'
答案 1 :(得分:4)
这是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
)