需求:将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,优化后仍是对的。