MySQL數(shù)據(jù)庫移植總結(jié)
一、前言
MySQL是一個由瑞典MySQL AB公司開發(fā)的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),目前歸屬Oracle公司旗下。MySQL是一種關(guān)聯(lián)數(shù)據(jù)庫管理系統(tǒng),它將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個大倉庫內(nèi),這樣就增加了速度并提高了靈活性。由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,一般中小型網(wǎng)站的開發(fā)都選擇MySQL作為網(wǎng)站數(shù)據(jù)庫。
考慮到MySQL的諸多優(yōu)點,很多通訊類軟件都開始采用MySQL作為其業(yè)務(wù)數(shù)據(jù)庫,前期采用Oracle或Sybase的軟件也啟動了向MySQL數(shù)據(jù)庫移植的工作。本文基于作者近期將Sybase數(shù)據(jù)庫移植為MySQL數(shù)據(jù)庫的工作,總結(jié)了在移植過程中需要修改的主要數(shù)據(jù)庫語法及一些基本的操作MySQL的命令。
二、需要修改的數(shù)據(jù)庫語法
1.基本語法
1) 將類似select xxx from %s..tb_xxx where xxx的語法修改為select xxx from %s.tb_xxx where xxx。
2) 將類似select top N * from tb_xxx的語法(查詢前N條記錄)修改為select * from tb_xxx limit N。
3) 將獲取當(dāng)前時間的語句convert(varchar(10),getdate(),102)+' '+convert(varchar(10),getdate(),108))修改為date_format(now(),'%Y.%m.%d %T')。
4) 將類似執(zhí)行沒有輸出參數(shù)的存儲過程的SQL語句exec %s..pr_xxx '%s'修改為call %s.pr_xxx ('%s')。
5) 將類似執(zhí)行有輸出參數(shù)的存儲過程的SQL語句exec %s..pr_xxx 1, '%s', 0, 0, %d, '', %d, 0, 0修改為call %s.pr_xxx(1,'%s',0,0,%d,'',%d,0,0,@1,@2,@3,@4,@5,@6);select@1,@2,@3,@4,@5,@6。
2.在存儲過程中
1) 將類似drop procedure pr_xxx語句修改為drop procedure if exists pr_ xxx;語句。
2) 在類似drop procedure if exists pr_ xxx;語句之后要添加delimiter //語句。
3) 對類似存儲過程輸入輸出參數(shù)作如下修改:
將
- createprocedure pr_xxx
- @aaa varchar(40),
- @bbb varchar(10),
- @ccc varchar(20),
- @ddd int out
修改為:
- createprocedure pr_ xxx
- (
- in p_ aaa varchar(40),
- in p_ bbb varchar(10),
- in p_ ccc varchar(20),
- out p_ ddd int
- )
4) 將類似定義的參數(shù)作如下修改:
將
- declare
- @aaa int,
- @bbb varchar(20),
- @ccc int,
- @ddd int,
修改為:
- declare p_aaa int;
- declare p_bbb varchar(20);
- declare p_ccc int;
- declare p_ddd int;
5) 將類似if @aaa = x語句修改為if p_aaa = x then語句。
6) 將類似select @aaa = x的初始化語句修改為set p_aaa = x;。
7) 將類似select @aaa=bbb from tb_xxx where ccc=yyy的語句修改為select bbb int op_aaa from tb_xxx where ccc=yyy;。
8) 將類似if語句修改如下:
將
- if xxx
- begin
- end
- else
- begin
- end
修改為:
- if xxx then
- begin
- end;
- else
- begin
- end;
- end if;
9) 將類似獲取當(dāng)前時間的select @curtime=convert(varchar(50),getdate(),102)+''+convert(varchar(50),getdate(),108)語句修改為set p_curtime=date_format(now(),'%Y.%m.%d %T');。
10) 將類似select @curdatetime = dateadd(minute, @tzonemin, @curdatetime)語句修改為set p_curdatetime=date_add(p_curdatetime,interval p_tzonemin minute);。
11) 將return語句修改為leave pr_xxx_label;。
12) 對存儲過程***的end語句作如下修改:
將
- end
修改為;
- end;
- //
- delimiter ;
13) 將存儲過程***的print語句作如下修改:
將
- print 'create procedure:pr_xxx ok!'
修改為:
- select 'create procedure pr_ xxx ok!';
14) 將類似的if語句作如下修改:
將
- if xxx
- begin
- end
- else if yyy
- begin
- end
- else if zzz
- begin
- end
- else
- begin
- end
修改為:
- if xxx then
- begin
- end;
- elseif yyy then
- begin
- end;
- elseif zzz then
- begin
- end;
- else
- begin
- end;
- end if;
15) 將類似select @maxcnt = convert(int,@tmpstr)語句修改為set p_maxcnt=convert(p_tmpstr,signed);語句。
16) 將類似select @boxnumber = convert(varchar,@tmpstr)語句修改為set p_boxnumber=convert(p_tmpstr, char(20));語句。
17) 將類似lasttime<=dateadd(day, 0-convert(int,dayvalue), getdate())語句修改為lasttime<=concat(date_format(date_sub(now(),interval convert(dayvalue,signed) day),'%Y.%m.%d'),' ',date_format(now(),'%T'))語句。
三、一些基本的操作MySQL的命令
作者所使用的數(shù)據(jù)庫位于Linux之下,因此,本節(jié)所使用的命令均是在Linux之下運行的。
1.啟動MySQL
- xpecdmoni
2.停止MySQL
- xsuperstop
3.登錄MySQL
1)MySQL位于本機之上:
- mysql -uusername -p'pwd'
(其中,username是用戶名,pwd是密碼)
2)MySQL在其它機器上:
- mysql -uusername -p'pwd' –h0.1.1.1-P3306
(其中,username是用戶名,pwd是密碼,0.1.1.1是MySQL數(shù)據(jù)庫的IP,3306是端口號)
4.切換數(shù)據(jù)庫
- use DbName;
(其中,DbName是數(shù)據(jù)庫名)
5.退出MySQL
- quit;
6.執(zhí)行SQL腳本
1) MySQL位于本機之上:
- mysql -uusername -p'pwd' -DDbName<test.sql
(其中,username是用戶名,pwd是密碼,DbName是數(shù)據(jù)庫名,test.sql是SQL腳本名)
2) MySQL在其它機器上:
- mysql -uusername -p'pwd' –h0.1.1.1 -P3306 -DDbName<test.sql
(其中,username是用戶名,pwd是密碼,0.1.1.1是MySQL數(shù)據(jù)庫的IP,3306是端口號,DbName是數(shù)據(jù)庫名,test.sql是SQL腳本名)
四、總結(jié)
在進行數(shù)據(jù)庫移植的過程中,我們需要注意以下問題:
1.只修改必須要修改的代碼,不能更改業(yè)務(wù)邏輯。要將修改之后的代碼與修改之前的代碼進行反復(fù)的對比,確保代碼修改的正確性。
2.要對修改之后的代碼和腳本等進行全方位的測試,確保業(yè)務(wù)邏輯的正確性。
3.如果有某段代碼或存儲過程是公用的,那么只需要指定某個人修改就可以了,這樣也可以防止重復(fù)勞動。
【本文是51CTO專欄作者周兆熊的原創(chuàng)文章,作者微信公眾號:周氏邏輯(logiczhou)】