将查询结果插入到现有表中
如現(xiàn)在由于公司人事部門合并后需要把數(shù)據(jù)庫(kù)中的USER_A中的數(shù)據(jù)復(fù)制到表USE_B中。那么就可以利用如下的語(yǔ)句來(lái)實(shí)現(xiàn):
| ????? Insert into USER_B (ad_user_id,Value,name,manager_id) Select ad_user_id,Value,name,manager_id from USER_A Where( manager_id =100001) |
一、需要指定源表中需要復(fù)制的列。
有時(shí)候可能復(fù)制與被復(fù)制的表表結(jié)構(gòu)不同。如需要把表A中的name(英文名字)字段復(fù)制到表B中的name2(中文名字)中。此時(shí)原有復(fù)制表與被復(fù)制表中字段的名稱不同,為此需要在上面的語(yǔ)句中,把所需要復(fù)制列名稱一一列舉出來(lái)。另外可能只需要把被復(fù)制表中的部分列復(fù)制到目的表總,此時(shí)也有顯示的指名所需要復(fù)制的列。注意復(fù)制對(duì)象與目標(biāo)對(duì)象都需要列出,以免發(fā)生張冠李戴的現(xiàn)象。筆者在使用這條語(yǔ)句的時(shí)候,不管任何情況,及時(shí)兩者表格中的內(nèi)容完全一致,筆者也習(xí)慣在語(yǔ)句中把字段的名稱一一的列出。雖然這會(huì)增加一定的工作量,但是卻可以提高這條語(yǔ)句執(zhí)行的準(zhǔn)確性。簡(jiǎn)而言之,就是需要在語(yǔ)句中指定源表zhon綱要復(fù)制其內(nèi)容的列;指定目標(biāo)表總要向其中復(fù)制數(shù)據(jù)的目標(biāo)列。即使兩這個(gè)表中的這些列名稱相同,也最好能夠顯示的指定。此時(shí)數(shù)據(jù)庫(kù)管理員不能夠偷懶,否則的話很容易導(dǎo)致數(shù)據(jù)插入錯(cuò)誤,而一切要重頭再來(lái)。
二、存儲(chǔ)數(shù)據(jù)時(shí)的順序。
如果現(xiàn)在在源表中有一萬(wàn)條符合條件的記錄要保存到目的表中,那么這些記錄在數(shù)據(jù)庫(kù)中存儲(chǔ)的順序應(yīng)該是什么呢?默認(rèn)情況下,其存儲(chǔ)的數(shù)據(jù)順序就是查詢結(jié)果所得到的順序。在沒(méi)有采用排序語(yǔ)句的情況下,其實(shí)就是源表中實(shí)際存儲(chǔ)的順序(一般按記錄創(chuàng)建的先后順序來(lái)保存)。不過(guò)有時(shí)候可能這個(gè)排序順序不怎么合理。筆者在認(rèn)為,最好對(duì)需要插入的結(jié)果進(jìn)行恰當(dāng)?shù)呐判?#xff0c;這有利于提高插入記錄的查詢效率。如在牧地中,可能對(duì)員工編號(hào)設(shè)置了索引;或者在目的表中查詢員工的信息是按員工編號(hào)來(lái)排序的。那么在目的表中插入數(shù)據(jù)的時(shí)候,最好能夠按員工的編號(hào)來(lái)進(jìn)行排列。是順序還是逆序排列要跟目的表中保持一致。如此的話,插入數(shù)據(jù)后進(jìn)行查詢的話,如需要查詢所有后來(lái)插入的結(jié)果,那么就不需要對(duì)其進(jìn)行重新排序。因?yàn)榇鎯?chǔ)的時(shí)候就是按照員工編號(hào)來(lái)插入,那么查詢出來(lái)的數(shù)據(jù)也是按照員工編號(hào)來(lái)的。可見(jiàn),為需要插入的數(shù)據(jù)設(shè)置合理的排序順序,這有利于提高以后查詢的性能。故筆者建議,為了提高數(shù)據(jù)庫(kù)的性能,最好在插入數(shù)據(jù)的時(shí)候利用Order BY語(yǔ)句指定插入數(shù)據(jù)時(shí)的順序。雖然這不是強(qiáng)制性的,但是筆者建議各位數(shù)據(jù)庫(kù)管理員還是要這么做。
三、指定復(fù)制行的條件。
需要把某張表中的記錄復(fù)制到另外一張表中,往往需要指定復(fù)制行的條件。也就是說(shuō),往往不會(huì)把源表中所有的記錄都復(fù)制到目的表中。如現(xiàn)在需要把員工信息A表中的數(shù)據(jù)復(fù)制到員工信息B表中。可是由于員工離職或者其他的原因,員工信息A表中的記錄可能有些已經(jīng)作廢掉了。如果把A表中的數(shù)據(jù)不加過(guò)濾就直接把全部記錄都一成不變的復(fù)制到B表中,那顯然會(huì)給B表增加不少的垃圾數(shù)據(jù)。為此在復(fù)制數(shù)據(jù)到目的表的表的時(shí)候,企業(yè)用戶可能只需要把現(xiàn)在還在職的員工信息復(fù)制到B表中。此似,在使用上面的語(yǔ)句時(shí),就需要利用Where條件來(lái)限制需要復(fù)制的行。如一般在數(shù)據(jù)庫(kù)系統(tǒng)設(shè)計(jì)的時(shí)候,都會(huì)在表中加入一個(gè)isactive類似的控制字段,表示當(dāng)前記錄是否有效。當(dāng)員工離職時(shí),不會(huì)刪除這個(gè)員工的信息,而是會(huì)把其設(shè)置為不活躍。在數(shù)據(jù)庫(kù)表中反應(yīng)出來(lái)的就是這個(gè)字段為N。為此,在上面的語(yǔ)句中,要把isactive列對(duì)應(yīng)的值為N的記錄去掉。所以如果在表與表合并的時(shí)候,需要根據(jù)一定的規(guī)則來(lái)過(guò)濾數(shù)據(jù)的話,則可以在語(yǔ)句中加入Where語(yǔ)句來(lái)進(jìn)行限制。這個(gè)限制雖然不是必須的,但是卻可以避免把一些垃圾數(shù)據(jù)也導(dǎo)入到新表中。
雖然數(shù)據(jù)庫(kù)管理員可以先把所有的記錄先都復(fù)制到目的表中,然后再利用delete語(yǔ)句進(jìn)行刪除。但是筆者并不贊成這么做。一方面這么做會(huì)額外的增加工作量;其次也會(huì)對(duì)目標(biāo)表中的數(shù)據(jù)產(chǎn)生破壞。因?yàn)樵谀繕?biāo)表中執(zhí)行delete語(yǔ)句中,如果條件設(shè)置不當(dāng),那么很有可能把目標(biāo)表中的數(shù)據(jù)也刪除了。所以說(shuō),復(fù)制記錄后再進(jìn)行刪除,這個(gè)操作會(huì)帶來(lái)一定的風(fēng)險(xiǎn)。一不小心,就會(huì)破壞源表中的數(shù)據(jù)。其實(shí),在復(fù)制的時(shí)候,在語(yǔ)句中加入Where限制語(yǔ)句就可以輕而易舉的避免這種風(fēng)險(xiǎn)。既然如此,數(shù)據(jù)庫(kù)管理員還有什么理由還需要在事后再冒這個(gè)風(fēng)險(xiǎn)呢?
四、插入結(jié)果時(shí)要注意數(shù)據(jù)的兼容性。
當(dāng)把記錄插入到目的表中,需要注意源表中的內(nèi)容必須與目標(biāo)中的列兼容。這主要包含兩個(gè)方面的含義。一是數(shù)據(jù)類型要兼容,二是其字段的大小需要兼容。如源表中的name字段的長(zhǎng)度為22;而目的表中這個(gè)字段的長(zhǎng)度只有20。則在執(zhí)行以上的語(yǔ)句時(shí),就很可能因?yàn)閿?shù)據(jù)長(zhǎng)度過(guò)長(zhǎng)而導(dǎo)致復(fù)制失敗。除了要注意這個(gè)字段長(zhǎng)度的兼容之外,還需要注意的是數(shù)據(jù)庫(kù)在復(fù)制的過(guò)程中會(huì)對(duì)某些數(shù)據(jù)類型進(jìn)行自動(dòng)的轉(zhuǎn)換。如源表中員工編號(hào)這個(gè)字段可能是采取流水號(hào)編號(hào),為此數(shù)據(jù)庫(kù)中的字段類型可能就是整數(shù)型。而在目的表中,對(duì)于員工編號(hào)采用部門號(hào)(字符)+流水號(hào)的形式,那么在數(shù)據(jù)庫(kù)表中其采用的就是字符類型格式。現(xiàn)在需要把源表中的員工編號(hào)的字段內(nèi)容復(fù)制到目的表中,是可以的。雖然兩者的數(shù)據(jù)類型不同,但是把整數(shù)型的數(shù)據(jù)復(fù)制到字符型的字段中,這是允許的。也就是說(shuō),他們是兼容的。但是需要注意的是,復(fù)制過(guò)去后,原先的整數(shù)型數(shù)據(jù)在目的表中會(huì)以字符型數(shù)據(jù)來(lái)存儲(chǔ),而不是整數(shù)型數(shù)據(jù)。為此如果后來(lái)因?yàn)槠渌?#xff0c;需要把目的表中的數(shù)據(jù)再?gòu)?fù)制到源表中時(shí),就會(huì)發(fā)生錯(cuò)誤。因?yàn)樽址蛿?shù)據(jù)是無(wú)法在整數(shù)型數(shù)據(jù)類型中進(jìn)行存儲(chǔ)。所以說(shuō),在數(shù)據(jù)庫(kù)中所謂的兼容往往是單向的。這一點(diǎn)在進(jìn)行記錄復(fù)制的時(shí)候,需要特別的當(dāng)心。
另外有些數(shù)據(jù)類型可能是不兼容的,那么在復(fù)制數(shù)據(jù)的時(shí)候,數(shù)據(jù)庫(kù)管理員需要采用數(shù)據(jù)類型轉(zhuǎn)換函數(shù)對(duì)其進(jìn)行強(qiáng)制轉(zhuǎn)換。如某個(gè)字段雖然存儲(chǔ)的都是數(shù)字,但是其數(shù)據(jù)庫(kù)中的數(shù)據(jù)類型是字符型的。此時(shí)需要把字符型的數(shù)據(jù)(全部都是數(shù)字)復(fù)制到整數(shù)型的字段中,則需要利用強(qiáng)制轉(zhuǎn)換函數(shù)先對(duì)數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換,然后再進(jìn)行復(fù)制。這也是解決數(shù)據(jù)類型不一致的一個(gè)有效措施。
五、執(zhí)行復(fù)制時(shí)的注意事項(xiàng)。
在使用這條語(yǔ)句的時(shí)候,需要注意其跟普通的insert語(yǔ)句不同。通常情況下,如果利用Insert語(yǔ)句插入記錄的時(shí)候,如果發(fā)現(xiàn)插入的記錄有問(wèn)題,則可以通過(guò)撤銷執(zhí)行插入操作(在沒(méi)有遞交事務(wù)之前)來(lái)撤銷插入的操作。但是使用insert into 語(yǔ)句進(jìn)行表與表之間合并記錄的時(shí)候,則是不能夠執(zhí)行撤銷操作的。為此為了數(shù)據(jù)的安全,最好在執(zhí)行insert into語(yǔ)句之前,對(duì)數(shù)據(jù)庫(kù)來(lái)一個(gè)手工的完全備份。如此當(dāng)這個(gè)操作有問(wèn)題的時(shí)候,則可以通過(guò)恢復(fù)數(shù)據(jù)庫(kù)來(lái)解決由此帶來(lái)的問(wèn)題。
另外,在執(zhí)行這個(gè)語(yǔ)句的時(shí)候,最好先執(zhí)行一下其SELECT子句,看看其查詢出來(lái)的結(jié)果是否符合用戶的需要。當(dāng)這個(gè)查詢語(yǔ)句設(shè)計(jì)準(zhǔn)確后,再把其跟Insert into 語(yǔ)句結(jié)合起來(lái)使用,這個(gè)方法可以提高表記錄合并的準(zhǔn)確率。雖然中間多了一個(gè)查詢的步驟,但是對(duì)于數(shù)據(jù)的準(zhǔn)確性來(lái)說(shuō),這一個(gè)步驟還是值得的。
總結(jié)
以上是生活随笔為你收集整理的将查询结果插入到现有表中的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: windows下使用开源gSOAP技术调
- 下一篇: 类型转换操作符:static_cast,