SQL --update批量更新

需求:將t_user_info表中user_img、nickname、user_bg_img三個字段的值設置成與t_hr表中的hr_name、hr_img、hr_bg_img三個字段的值同樣。sql

t_user_info表以下數據庫

t_hr表以下優化

t_user_info表數據存放狀況以下ui

t_hr表數據存放狀況code

由兩張數據表存放數據狀況能夠看出,t_user_info表裏存放的是用戶信息,id從1000000000開始,依次推增。t_hr表裏存放的是hr信息,他們的關係是:用戶= 普通用戶+HR用戶。
class

需求分析:im

工程開始的時候,t_user_info表裏的user_img數據與t_hr表裏hr_img數據並無保持一致。現現在要求設置成一致。數據

即須要批量更新t_user_info表裏user_img、user_bg_img和nickname字段。項目

最開始,我寫的sql以下,(這裏爲了方便起見,先更新一個字段試下)查詢

UPDATE t_user_info tui
SET tui.USER_IMG = (
    SELECT
        th.HR_IMG
    FROM
        t_hr th
    WHERE
        th.USE_FLAG = 1
    AND 
        th.AUDIT_FLAG = 1
    AND tui.USER_ID = th.HR_ID
)

接着,我驗證我寫的sql是否是對的,查看數據庫,結果發現:

1.t_hr表中hr_id 等於 t_user_info表中user_id的數據都是對的

2.兩個id不相等的數據,都被賦值成 空數據了,圖以下

更新以前,我將t_user_info表裏面user_img的數據所有設置成1


上述sql更新以後的圖以下


很明顯user_id在t_hr表中存在的數據都更新成功了,例如:1000000000、100000000一、100000000四、……等。

當user_id不在t_hr表中的數據,例如100000000二、100000000三、100000000五、……等,就出現了錯誤,本來的數據爲1,更新後變成空了。

接着開始找緣由

很明顯,上述的跟新是將t_user_info表中全部的數據都更新了,咱們的需求是僅僅只須要更新user_id=hr_id的數據,user_id本來的數據還須要保留。所以,想到了在更新語句後面加條件,SQL以下:


很明顯看到上述sql報錯了,找不到th.HR_ID這列。

我就在這個帶條件的地方卡了好久

最終在網上查找資料時,才發現updatre語句後面,能夠跟多張表,接着將SQL改爲以下


執行語句成功了,這步很關鍵。可是發現執行後message裏面的信息,發現受影響的行數爲35。

接着來查找知足條件的總個數是否是35,執行以下SQL


發現是25

對比查詢where後的條件發現,原來是更新語句的條件帶少了,立刻補上去,SQL以下


恩恩,這就對了,接着我補上了USER_BG_IMG、NICKNAME,SQL以下

UPDATE t_user_info tui,t_hr th
SET tui.USER_IMG = (
    SELECT
        th.HR_IMG
    FROM
        t_hr th
    WHERE
        th.USE_FLAG = 1
    AND 
        th.AUDIT_FLAG = 1
    AND tui.USER_ID = th.HR_ID
),
tui.USER_BG_IMG = (
    SELECT
        th.HR_BG_IMG
    FROM
        t_hr th
    WHERE
        th.USE_FLAG = 1
    AND 
        th.AUDIT_FLAG = 1
    AND tui.USER_ID = th.HR_ID
),
tui.NICKNAME = (
    SELECT
        th.HR_NAME
    FROM
        t_hr th
    WHERE
        th.USE_FLAG = 1
    AND 
        th.AUDIT_FLAG = 1
    AND tui.USER_ID = th.HR_ID
)
    WHERE
        th.USE_FLAG = 1
    AND 
        th.AUDIT_FLAG = 1
    AND tui.USER_ID = th.HR_ID

接着很開心的交了任務。不一下子,項目經理看到這段代碼了,立馬改寫了SQL,以下

UPDATE t_user_info tui,t_hr th
SET tui.user_img = th.hr_img,
 tui.user_bg_img = th.hr_bg_img,
 tui.NICKNAME = th.HR_NAME
WHERE
    tui.user_id = th.hr_id
AND th.USE_FLAG = 1
AND th.AUDIT_FLAG = 1

其實,仔細看了下SQL,優化後仍是對的。

相關文章
相關標籤/搜索