需求:將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,優化後仍是對的。