新聞中心
SQL里怎么把一個(gè)數(shù)據(jù)庫的表復(fù)制到另一個(gè)數(shù)據(jù)庫?
創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),大石橋企業(yè)網(wǎng)站建設(shè),大石橋品牌網(wǎng)站建設(shè),網(wǎng)站定制,大石橋網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,大石橋網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
1.
SELECT * INTO 表1 FROM 表2 --復(fù)制表2
如果只復(fù)制結(jié)構(gòu)而不復(fù)制內(nèi)容或只復(fù)制某一列
只要加WHERE條件就好
2.
假設(shè)你有數(shù)據(jù)庫A和數(shù)據(jù)庫B,現(xiàn)將數(shù)據(jù)庫A中的Table_A的數(shù)據(jù)復(fù)制到數(shù)據(jù)庫B中的Table_B,語句
1如果Table_A和Table_B的結(jié)構(gòu)一樣:
use B
insert into Table_B select * from A.dbo.Table_A
2如果Table_A和Table_B的結(jié)構(gòu)一樣:
insert into Table_B(B字段1B字段2...) select A字段1A字段2... from A.dbo.Table_A
上面的兩個(gè)實(shí)例用到了select into from 和 insert into select ,那么這兩個(gè)語法有什么不同哪?
select into from 和 insert into select都是用來復(fù)制表,兩者的主要區(qū)別為: select into from 要求目標(biāo)表不存在,因?yàn)樵诓迦霑r(shí)會自動創(chuàng)建。insert into select from 要求目標(biāo)表存在
備份表數(shù)據(jù): create table emp as select from scott.emp
還原表數(shù)據(jù):insert into emp select from scott.emp
- 復(fù)制表結(jié)構(gòu)及其數(shù)據(jù):
create table table_name_new as select * from table_name_old
- 只復(fù)制表結(jié)構(gòu):
create table table_name_new as select * from table_name_old where 1=2;
或者:
create table table_name_new like table_name_old
- 只復(fù)制表數(shù)據(jù):
如果兩個(gè)表結(jié)構(gòu)一樣:
insert into table_name_new select * from table_name_old
如果兩個(gè)表結(jié)構(gòu)不一樣:
insert into table_name_new(column1,column2...) select column1,column2... from table_name_old
pasting
再次對使用SELECT INTO 和 INSERT INTO SELECT 表復(fù)制語句了,進(jìn)行說明
1.INSERT INTO SELECT語句
語句形式為:Insert into Table2(field1,field2,...) select value1,value2,... from Table1 [where column =value]
[]為可選內(nèi)容
要求目標(biāo)表Table2必須存在,由于目標(biāo)表Table2已經(jīng)存在,所以我們除了插入源表Table1的字段外,還可以插入常量。示例如下:
insert into tjjrmx(yybh,xh,tjxmbh,jg,sfyx,zhxmbh,tjksbh,jcrq,jcys,ts,ckfw,disporder)
select '24',xh,tjxmbh,jg,sfyx,zhxmbh,tjksbh,jcrq,jcys,ts,ckfw,disporder from tjjrmx where yybh = 5
2.SELECT INTO FROM語句
語句形式為:SELECT vale1, value2 into Table2 from Table1
要求目標(biāo)表Table2不存在,因?yàn)樵诓迦霑r(shí)會自動創(chuàng)建表Table2,并將Table1中指定字段數(shù)據(jù)復(fù)制到Table2中。示例如下
-------------------------------------------------------------------------------------------------------------------
實(shí)戰(zhàn)例1
如何在MySQL從多個(gè)表中組合字段然后插入到一個(gè)新表中(特別是在多個(gè)表的數(shù)據(jù)集中到一個(gè)表時(shí)),通過一條sql語句實(shí)現(xiàn)。具體情形是:有三張表a、b、c,現(xiàn)在需要從表b和表c中分別查幾個(gè)字段的值插入到表a中對應(yīng)的字段。對于這種情況,我們可以使用如下的語句來實(shí)現(xiàn):
1. INSERT INTO db1_name(field1,field2) SELECT field1,field2 FROM db2_name
當(dāng)然,上面的語句比較適合兩個(gè)表的數(shù)據(jù)互插,如果多個(gè)表就不適應(yīng)了。對于多個(gè)表,我們可以先將需要查詢的字段join起來,然后組成一個(gè)視圖后再select from就可以了:
2.1 INSERT INTO a(field1,field2) SELECT FROM(SELECT f1,f2 FROM b JOIN c) AS tb
其中f1是表b的字段,f2是表c的字段,通過join查詢就將分別來自表b和表c的字段進(jìn)行了組合,然后再通過select嵌套查詢插入到表a中,這樣就滿足了我們這個(gè)場景了,如果需要不止2個(gè)表,那么可以多個(gè)join的形式來組合字段。需要注意的是嵌套查詢部分最后一定要有設(shè)置表別名,如下:
2.2 SELECT FROM(SELECT f1,f2 FROM b JOIN c) AS tb
即最后的as tb是必須的(當(dāng)然tb這個(gè)名稱可以隨意取),即指定一個(gè)別名,否則在mysql中會報(bào)如下錯(cuò)誤:
2. 3 ERROR 1248 (42000): Every derived TABLE must have its own alias
即每個(gè)派生出來的新表都必須指定別名才可以的。
***********************************************************************************************************
實(shí)戰(zhàn)例2
insert觸發(fā)器 insert into select同時(shí)插入多條記錄
需求:寫了一個(gè)FOR INSERT的觸發(fā)器,每次插入數(shù)據(jù)的時(shí)候向相關(guān)的數(shù)據(jù)表中也同時(shí)插入數(shù)據(jù)。
問題:測試的時(shí)候,一次只向主表中插入一條記錄,那么觸發(fā)器沒有問題。在實(shí)際使用的時(shí)候,因?yàn)槭褂昧薸nsert into select語句,一次向主表中插入了超過一條的記錄,如17條,但是發(fā)現(xiàn)其他數(shù)據(jù)表中卻都只有一條記錄,明顯出現(xiàn)了錯(cuò)誤。
解決:
1、上網(wǎng)查詢“一次插入多條”這樣的關(guān)鍵字
2、通過在觸發(fā)器中書寫:select count(*) from inserted,的確可以看到一次插入了多條
3、網(wǎng)上說用“游標(biāo)”來實(shí)現(xiàn)
分析:
1、其實(shí)不用右邊也可以,如果只是把插入的數(shù)據(jù)直接插入其他相關(guān)的數(shù)據(jù)表,完全可以使用insert into (select from inserted)來實(shí)現(xiàn)。
例如:
CREATE TRIGGER TriInsertStoreFile ON tblStore
FOR INSERT
AS
BEGIN
Insert into storeFile(storeID) (SELECT storeID FROM INSERTED)
END
2、而我在實(shí)際應(yīng)用中,還存在與storeFile關(guān)聯(lián)的storeFileItem數(shù)據(jù)表,要用插入storeFile時(shí)自動生成的主鍵FileID,插入storeFileItem中作為外鍵關(guān)聯(lián),看來只有用"游標(biāo)"了,其實(shí)也不難
CREATE TRIGGER TriInsertStoreFile ON tblStore
FOR INSERT
AS
DECLARE @storeID int
DECLARE @FILEID int
SET @storeID=0
SET @FILEID=0
DECLARE stores_cursor CURSOR FOR
SELECT storeID FROM Inserted
OPEN stores_cursor
FETCH NEXT FROM stores_cursor
INTO @storeID
WHILE @@FETCH_STATUS = 0
BEGIN
Insert into storeFile(storeID) (SELECT storeID FROM INSERTED)
SET @FILEID=@@identity
Insert into storeFileItem(fileID) values(@FILEID)
FETCH NEXT FROM stores_cursor INTO @storeID
END
CLOSE stores_cursor
DEALLOCATE stores_cursor
總算解決問題。
最后能把對其他數(shù)據(jù)表的插入寫在單獨(dú)的存儲過程中,就更理想了
sqlserver在觸發(fā)器中執(zhí)行動態(tài)sql用到inserted(deleted)表
這兩天公司產(chǎn)品中要加個(gè)數(shù)據(jù)同步用的觸發(fā)器,oracle版沒什么問題,很順利的寫完了。
在寫sqlserver版時(shí)遇到了麻煩。由于在觸發(fā)器中要根據(jù)inserted(deleted)表的數(shù)據(jù),對另一個(gè)表進(jìn)行更新操作,而這個(gè)表的某些字段是不固定的,所以需要寫成動態(tài)sql,利用exec來執(zhí)行。這時(shí)麻煩來了,exec執(zhí)行時(shí),無法訪問到inserted(deleted)表。壞了,這該如何是好?
經(jīng)反復(fù)google+baidu+試驗(yàn),問題總算解決了??偨Y(jié)一下,大致有以下兩種方法:
1、將inserted(deleted)表的數(shù)據(jù)放到臨時(shí)表#temp,然后再來exec;
2、用游標(biāo)對inserted(deleted)表進(jìn)行逐條處理。
具體采用哪種,可根據(jù)業(yè)務(wù)特點(diǎn)來定
網(wǎng)站題目:INSERTINTOSELECT語句及使用
轉(zhuǎn)載來源:http://fisionsoft.com.cn/article/igcics.html