今天同事問我乙個問題:他需要每天將tablea中指定條件下的資料copy到tableb中,並刪除tableb中已被copy的資料,應該用什麼方法高效一些?聽到這個方法之後第一反映就是想到在我上家公司的時候,也做了同樣的資料備份工作,不過當時指令碼是我老大寫的,我只是看了一眼,大概是將需要備份的資料查詢出來,在迴圈結果集逐條將資料移走,為了減少資料壓力,並每處理500記錄之後commit一次。當時只是看了這種想法,也沒多想這種寫法用到了什麼,結果也只是告訴同事這樣乙個思路。
現在回來諮詢了下度娘,終於找到了原來使用的是游標(這裡使用的是oracle,當然游標在db2,mysql等資料庫中也是可以使用的)
現在簡單舉例利用游標進行資料備份(移動)
背景:表a
testa(
id int,
name varchar2(20)
表btestb(
id int,
name varchar2(20)
第一種游標使用方法
declare
--型別定義
cursor c_job
isselect id,name
from testa;
--定義乙個游標變數c_row c_job%rowtype ,該型別為游標c_job中的一行資料型別
c_row c_job%rowtype;
begin
for c_row in c_job loop
insert into testb(id,name)values(c_row.id,c_row.name);
delete from testa where id=c_row.id and name=c_row.name;
end loop;
commit;
end;
在上面一種方法中,一次性將資料全部,如果資料量較小的話,倒沒有什麼影響,但如果是大量的資料,一次做commit,會大的增加資料庫的資源消耗,因此可以採用下面的方法來拿到rownum(oracle有此關鍵字)來定資料量commit
declare
--型別定義
cursor c_job
isselect id,name,rownum
from testb;
--定義乙個游標變數c_row c_job%rowtype ,該型別為游標c_job中的一行資料型別
c_row c_job%rowtype;
begin
for c_row in c_job loop
insert into testa(id,name)values(c_row.id,c_row.name);
delete from testb where id=c_row.id and name=c_row.name;
if c_row.rownum=2 then
commit;
end if;
end loop;
commit;
end;
當然如果不用rownum的話,也可以定義變數來進行i++的操作記錄
declare
--定義變數i為int型別,值為0;
i int:=0;
--型別定義
cursor c_job
isselect id,name,rownum
from testa;
--定義乙個游標變數c_row c_job%rowtype ,該型別為游標c_job中的一行資料型別
c_row c_job%rowtype;
begin
for c_row in c_job loop
i:=i+1;--進行i+1
insert into testb(id,name)values(c_row.id,c_row.name);
delete from testa where id=c_row.id and name=c_row.name;
if i=2 then
commit;
end if;
end loop;
commit;
end;
對於游標不熟悉的同鞋,這裡提供乙份游標學習資料,希望可以幫忙到大家(其實我也是剛才學習到,吼吼)
oracle游標使用方法及語法大全
oracle游標詳解
用游標來對資料庫的多行資料進行操作
我們知道,在儲存過程中用dml語句,只能查詢單條記錄,如果要對多條資料進行處理,那麼就要用到游標,下面以例子來說明 如果對scott使用者下的emp表中的使用者名為clerk的每個使用者進行薪金加100的操作。create or replace procedure p salary iscursor...
mysqldump進行資料庫備份
最近,遇到乙個場景需要對mysql資料庫進行備份,本文記錄一下。1.對整個資料庫備份,包括表結構和資料 格式 mysqldump h資料庫ip u使用者名稱 p 資料庫名 d xx.sql 檔案存放路徑 示例 mysqldump h132.72.192.432 uroot p test home c...
xtrabackup進行資料庫備份
最近需要將線上資料庫的資料同步到線下測試環境,所以在找資料庫同步的方法,發現了xtrabackup這個工具,便想試下是否可行。開源,免費,備份速度快,感覺挺強大有木有,廢話不多說,開始安裝。wget rpm ivh percona release 0.1 4.noarch.rpm yum y nog...