mysqlは条件に基づいて特定の更新を行います

通常の更新操作ではニーズを満たせなくなることがあり、さまざまな条件に応じて特定の更新を行う必要があります。たとえば、フィールドは通常どおり直接更新され、他のフィールドは条件に応じて更新する必要があります。以下の例を参照してください。

元のテーブルデータ:



要求する:

1.すべてのレコードで、IS_ENABLEフィールドが1に変更されます。

2. IDが最大レコードの場合、IS_ENABLE時刻は「2017-09-0909:09:09」に変更され、残りのレコードの場合、時刻は「2017-01-01 00:」に変更されます。 00:00 "


SQLステートメントは次のとおりです。

update t_iov_user_car_info set IS_ENABLE=1,
LAST_UPDATED_DATE=
( 
 case when id=(select a.id from (select max(id) id from t_iov_user_car_info uc where uc.USER_ID_CARD=4) a) 
 then '2017-09-09 09:09:09' 
 else '2017-01-01 00:00:00' end
)
 where USER_ID_CARD=4

結果:

ご覧のとおり、IS_ENABLEフィールドデータはすべて1に変更されています。これが通常の変更操作です。

その他のレコードの場合、時刻は2017-01-01 00:00:00に変更され、最大ID(id = 233)のレコードの場合、時刻は次のように変更されました:2017-09-09 09:09: 09。

これは特定の更新を行うためです。


SQL分析:

それらの中で、ステートメント:

select max(id) id from t_iov_user_car_info uc where uc.USER_ID_CARD=4 
最大のIDを照会することです。では、なぜこのステートメントの前に追加するのですか?

からa.idを選択しますか?これは、mysqlが最初に同じテーブル内のいくつかの値を選択してから(同じステートメント内で)このテーブルを更新できないためです。そうしないと、エラーが報告されます。

「FROM句で更新対象のテーブルを指定することはできません」。

解決策は、エラーを回避するために、中間テーブルを介して選択の結果を再度選択することです。

この問題はmysqlでのみ発生し、mssqlとoracleではこの問題が発生しないことに注意してください。


次のSQLステートメント:

LAST_UPDATED_DATE=
( 
 case when id=(select a.id from (select max(id) id from t_iov_user_car_info uc where uc.USER_ID_CARD=4) a) 
 then '2017-09-09 09:09:09' 
 else '2017-01-01 00:00:00' end
)

その意味は非常に明確で、Javaコードと同等です。

if(id=最大){
LAST_UPDATED_DATE='2017-09-09 09:09:09' ;
}else{
LAST_UPDATED_DATE='2017-01-01 00:00:00' ;
}

OK、それだけです。


おすすめ

転載: blog.csdn.net/u012660464/article/details/78615916