在利用數(shù)據(jù)庫開發(fā)時(shí),常常會(huì)將一些表之間的數(shù)據(jù)互相導(dǎo)入。當(dāng)然可以編寫程序?qū)崿F(xiàn),但是,程序常常需要開發(fā)環(huán)境,不方便。最方便是利用sql語言直接導(dǎo)入。既方便而修改也簡單。以下就是導(dǎo)入的方法。
成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比禪城網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式禪城網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋禪城地區(qū)。費(fèi)用合理售后完善,十載實(shí)體公司更值得信賴。
1、 表結(jié)構(gòu)相同的表,且在同一數(shù)據(jù)庫(如,table1,table2)
Sql :
復(fù)制代碼代碼如下:
insert into table1 select * from table2 (完全復(fù)制)
insert into table1 select distinct * from table2(不復(fù)制重復(fù)紀(jì)錄)
insert into table1 select top 5 * from table2 (前五條紀(jì)錄)
2、不在同一數(shù)據(jù)庫中(如,db1 table1,db2 table2)
sql:
[code]
insert into db1.table1 select * from db2.table2 (完全復(fù)制)
insert into db1.table1 select distinct * from db2table2(不復(fù)制重復(fù)紀(jì)錄)
insert into tdb1.able1 select top 5 * from db2table2 (前五條紀(jì)錄)
3、表結(jié)構(gòu)不同的表或復(fù)制部分紀(jì)錄(如,dn_user,dn_user2)
a. 建一個(gè)新表[DN_UserTemp](在老表dn_user上增加一列)
mysql無論如何也做不到用一條語句給兩張表插入數(shù)據(jù)。
理由:一個(gè)insert語句僅能在一個(gè)表中插入,這是語法的規(guī)定。
工具:mysql 5.6
步驟(即插入數(shù)據(jù)舉例):
1、如user表有如下數(shù)據(jù):
2、要將一條新數(shù)據(jù),id為6,name為lilei插入表中,用如下語句:
insert?into?user(id,name)?values?(5,'lilei');
3、插入后結(jié)果:
一條語句同時(shí)插入兩個(gè)表是做不到的
可以考慮在A表上建一個(gè)觸發(fā)器,當(dāng)向A表插入數(shù)據(jù)時(shí),同時(shí)插入一條記錄到B表
以mysql數(shù)據(jù)庫為例分情況一一說明:兩張表:insertTest和insertTest2,前者中有測試數(shù)據(jù)
create table insertTest(id int(4),name varchar(12));
insert into insertTest values(100,'liudehua');
insert into insertTest values(101,'zhourunfa');
insert into insertTest values(102,'zhouhuajian');
1.如果2張表的字段一致,并且希望插入全部數(shù)據(jù),可以用這種方法:
INSERT INTO 目標(biāo)表 SELECT * FROM 來源表;
insert into insertTest select * from insertTest2;
2.如果只希望導(dǎo)入指定字段,可以用這種方法:
INSERT INTO 目標(biāo)表 (字段1, 字段2, ...) SELECT 字段1, 字段2, ... FROM 來源表;
注意字段的順序必須一致。
insert into insertTest2(id) select id from insertTest2;
3.如果您需要只導(dǎo)入目標(biāo)表中不存在的記錄,可以使用這種方法:
INSERT INTO 目標(biāo)表
(字段1, 字段2, ...)
SELECT 字段1, 字段2, ...
FROM 來源表
WHERE not exists (select * from 目標(biāo)表
where 目標(biāo)表.比較字段 = 來源表.比較字段);
1.插入多條記錄:
insert into insertTest2
(id,name)
select id,name
from insertTest
where not exists (select * from insertTest2
where insertTest2.id=insertTest.id);
2.插入一條記錄:
insert into insertTest
(id, name)
SELECT 100, 'liudehua'
FROM dual
WHERE not exists (select * from insertTest
where insertTest.id = 100);
使用 dual 作表名,select 語句后面直接跟上要插入的字段的值。
4.將查詢出來的數(shù)據(jù)并同其他變量一起插入新的數(shù)據(jù)表中
insert into t_supp_PurchPlan_s(PurPlanCode,itemcode,Speccode) select 'hello'as PurPlanCode,itemcode,speccode from b_item where id=8
直接將變量放到相應(yīng)的位置即可(如上將固定的變量或動(dòng)態(tài)變量放入即可)
insert all
into A (a,b,c)
values(value-a,value-b,value-c)
into B(d,e,f)
values(value-d,value-e,value-f)
select value-a,value-b,value-c,value-d,value-e,value-f
from TableX
where ...;
在數(shù)據(jù)庫中創(chuàng)建存儲(chǔ)過程,比如存儲(chǔ)過程的名字叫做 test
在java中和正常使用sql的方法一樣, sql = "call test(B1,B2)", B1和B2是假設(shè)你將要插入b表中的數(shù)據(jù)
假設(shè)b表的結(jié)構(gòu)是(ID int auto_incremet, B1 int, B2 int)
假設(shè)a表的結(jié)構(gòu)是(ID int)
CREATE test(B1 int, B2 int) #假設(shè)A1和A2是將要插入b表中的數(shù)據(jù)
BEGIN
declare new_id as int; #聲明自增長所添加的ID
insert into b(B1,B2) values(B1,B2); #給b插入新的記錄
select last_insert_id() into new_id; #取得新插入記錄的ID
insert into a(ID) values(new_id); #把新插入的ID寫入a表
select new_id; #如果需要的話存儲(chǔ)過程返回新得到的ID給客戶端
END
注意: 為什么推薦使用存儲(chǔ)過程,而不是直接在java程序中使用select last_insert_id(); 因?yàn)檫@個(gè)函數(shù)是打開當(dāng)前端口時(shí),返回最后一個(gè)插入的自增長的ID, 如果不用存儲(chǔ)過程,可能當(dāng)前鏈接關(guān)閉,或有其他的應(yīng)用也在其他有自增長ID的表中插入新的記錄, 這時(shí)你取回的ID就是錯(cuò)誤的。