免费A级毛片无码专区网站-成人国产精品视频一区二区-啊 日出水了 用力乖乖在线-国产黑色丝袜在线观看下-天天操美女夜夜操美女-日韩网站在线观看中文字幕-AV高清hd片XXX国产-亚洲av中文字字幕乱码综合-搬开女人下面使劲插视频

我操作MySQL的驚險(xiǎn)一幕

背景前幾天因工作需要,組長給我安排了一個(gè)數(shù)據(jù)清洗的任務(wù) 。

任務(wù):把 A 表的數(shù)據(jù)洗到 B 表 。
我的第一反應(yīng),什么是「洗」?洗數(shù)據(jù)是什么?洗錢我倒是知道 。
不過我不能慌啊,于是問了問組長 。
我:組長,把 A 表的數(shù)據(jù)洗到 B 表是什么意思?
組長一臉無奈,手捂住臉,恨鐵不成鋼,然后調(diào)整過來,還是很耐心地跟我講的,大概意思就是我們現(xiàn)在 B 表需要 A 表的數(shù)據(jù),A 表中和 B 表中字段含義一樣,但是值可能不一樣,這就需要我們進(jìn)行處理,在將 A 表數(shù)據(jù)搞到 B 表的過程中,把數(shù)據(jù)搞正確 。
基于我理解能力有限,當(dāng)時(shí)并不是很懂所謂的「洗數(shù)據(jù)」,而且這個(gè) A 表的字段也和 B 表的字段沒怎么對上,A 的字段明顯多于 B 的字段,某些字段命名也和 B 不一樣,但是表達(dá)的意思是一樣的,該如何洗?
于是瘋狂搜索如何洗數(shù)據(jù)!
我這里就舉個(gè)例子來說明,分別給出 A 表和 B 表,當(dāng)然我只列出了一部分字段,現(xiàn)在假設(shè)就這么多字段 。
A 表A 表字段:name, province_id, city_id, area_id, tech_id, crop_id, field_id, create_time, update_time, xxx, yyy, zzz, ...
A 表的字段是多于 B 表的,我需要將 A 表的數(shù)據(jù)洗到 B 表,只處理我需要的字段,不需要的就不用理 。
A 表中有 2 萬多條記錄,B 表我自己插入的有 200 多條記錄 。
當(dāng)然,給出 A 表后,還給了個(gè)實(shí)體模型(JavaBean,Entity,超多種叫法,花里胡哨的)
public class A {private String name;private Long provinceId;private Long cityId;private Long areaId;private Long techId;private Long cropId;private Date createTime;private Date updateTime;...}B 表B 表字段:name, province_id, city_id, area_id, mature_id, crop_id, create_time, update_time
還原現(xiàn)場下面我模擬測試環(huán)境中數(shù)據(jù)庫的那兩張表,上面是 A 表(2 萬多條記錄,這里我只模擬了 7 條),下面的 B 表(200 多條記錄) 。
我操作MySQL的驚險(xiǎn)一幕

文章插圖
洗數(shù)據(jù)思路首先,我是先找出 A 表中能和 B 表對上意思的字段,然后將 A 表數(shù)據(jù)全部插入到 B 表中 。
于是,我便找出了如下這些字段:
name, province_id, city_id, area_id, tech_id, crop_id, update_time
【我操作MySQL的驚險(xiǎn)一幕】之后在 B 表中對新插入的數(shù)據(jù)進(jìn)行處理,即洗數(shù)據(jù) 。
寫 SQL 操作主要的 SQL 語句是:
INSERT INTO 目標(biāo)表(字段1, 字段2, ...) SELECT 字段1, 字段2, ... FROM 來源表 WHERE 條件;于是,便這樣操作:
INSERT INTO b(name, province_id, city_id, area_id, mature_id, crop_id, update_time)SELECT name, province_id, city_id, area_id, tech_id, crop_id, update_time FROM a;操作是正常的,成功將 A 中 2 萬多條記錄全部插入到了 B 中 。
但是!我漏了一個(gè)字段,就是 create_time
我操作MySQL的驚險(xiǎn)一幕

文章插圖
于是,想著對這個(gè)字段進(jìn)行更新,將 A 中這個(gè)字段更新到 B 中 。
于是寫了一條SQL語句 。
UPDATE b(create_time) SET create_time = (SELECT create_time FROM a);> 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(create_time) SET create_time = (SELECT create_time FROM a)' at line 1噢,看來不能這樣更新啊!(一個(gè)大嘴巴子過去,寫錯(cuò)了還沒發(fā)現(xiàn))
換種寫法:
UPDATE b AS tb, (SELECT create_time FROM a) AS ta SET tb.create_time = ta.create_time;可以,噩夢開始了!
更新了非常久,看著十幾秒的SQL執(zhí)行到六七百秒還沒執(zhí)行完,心里著實(shí)很慌!眼看著數(shù)據(jù)庫可能會崩,我不得不向我的組長求救了!

經(jīng)驗(yàn)總結(jié)擴(kuò)展閱讀