4

フィールド account_no、card_no、is_blocked、is_activated、issue_date がある 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
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 パーサーのばかげた制限の 1 つです。これを解決する通常の方法は、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
                    )
于 2012-10-01T07:01:03.807 に答える