oracle转mysql总结经验,oracle转mysql总结(转)
ares-sdk初始開發(fā)測試使用的是oracle數(shù)據(jù)庫,由于寧波通商的特殊需要,必須把數(shù)據(jù)庫環(huán)境從oracle轉向mysql。 現(xiàn)對轉換過程中出現(xiàn)的問題及經(jīng)驗總結如下:
主鍵生成策略
創(chuàng)建一個專門記錄序列的表sequence,記錄有當前序列號,序列的間隔如+1
創(chuàng)建記錄當前序列的表
DROP TABLE IF EXISTS sequence;
CREATE TABLE sequence (
name VARCHAR(50) NOT NULL,
current_value INT NOT NULL,
increment INT NOT NULL DEFAULT 1,
PRIMARY KEY (name)
) ENGINE=InnoDB;
INSERT INTO sequence VALUES (‘MovieSeq‘,3,5);
創(chuàng)建一個獲取當前序列的function
DROP FUNCTION IF EXISTS currval;
CREATE FUNCTION currval (seq_name VARCHAR(50))
RETURNS INTEGER
CONTAINS SQL
BEGIN
DECLARE value INTEGER;
SET value = 0;
SELECT current_value INTO value
FROM sequence
WHERE name = seq_name;
RETURN value;
END;
獲取下一個數(shù)值..先在sequence里面調用update當前最大數(shù)值+1然后再調用currval獲得當前數(shù)值
DROP FUNCTION IF EXISTS nextval;
DELIMITER $
CREATE FUNCTION nextval (seq_name VARCHAR(50))
RETURNS INTEGER
CONTAINS SQL
BEGIN
UPDATE sequence
SET current_value = current_value + increment
WHERE name = seq_name;
RETURN currval(seq_name);
END$
DELIMITER ;
DROP FUNCTION IF EXISTS setval;
DELIMITER $
CREATE FUNCTION setval (seq_name VARCHAR(50), value INTEGER)
RETURNS INTEGER
CONTAINS SQL
BEGIN
UPDATE sequence
SET current_value = value
WHERE name = seq_name;
RETURN currval(seq_name);
END$
DELIMITER ;
如果以上語句執(zhí)行有異常請先執(zhí)行這句:set global logbintrustfunctioncreators=TRUE;
插入時的主鍵生成:
mysql: SELECT MMC.NEXTVAL(‘SEQ_MD_ENTITY_ATTRIBUTE‘)
oracle: select MMC.SEQ_MD_ENTITY_ATTRIBUTE.nextval from dual
日期處理
mysql : DATE_FORMAT(NOW(),‘%Y-%m-%d %H:%i:%s‘)
oracle: TO_CHAR(SYSDATE,‘YYYY-MM-DD hh24:mi:ss‘)
nvl函數(shù)
mysql: ifnull(A.USER_KPI,0)
oracle: NVL(A.USER_KPI,0)
to_number
oracle 的 to_number
mysql不需要
關鍵字、保留字
涉及到關鍵字,mysql關鍵字需要加上``號
mysql: PARA_VALUE as `KEY`
oracle : PARA_VALUE as KEY
rownum
Unknown column ‘rownum‘ in ‘where clause‘
oracle自定義sql中如果使用了rownum=1 mysql中可以寫成limit 1
大小寫問題
在oracle中一般情況下不區(qū)分大小寫
但在MySQL中,所使用操作系統(tǒng)的大小寫敏感性決定了數(shù)據(jù)庫名和表名的大小寫敏感性。
解決的辦法是把mysql的數(shù)據(jù)庫名和oracle的大小寫保持一致,
表名與應用程序中sql字符串中的表名保持一致,
如果應用程序中字段名用了雙引號,那請把sql中的字段名大小寫與雙引號里的字符保持一致。
如果你的應用程序所引用的表名、字段沒有統(tǒng)一大小寫,那麻煩就大了。
字符串截取
mysql:
截取log_data從逗號開始之后的字符:
SELECT substring_index(log_data,‘,‘,-1)
FROM nbts.log where event_id=‘150002‘ and log_id =‘a2a421734c7e47dd8a8b‘;
截取log_data從逗號開始之前的字符:
SELECT substring_index(log_data,‘,‘,1)
FROM nbts.log where event_id=‘150002‘ and log_id =‘a2a421734c7e47dd8a8b‘;
oracle :
截取log_data從逗號開始之后的字符:
SELECT SUBSTR(log_data, INSTR(log_data, ‘,‘, 1, 1) +1) AS app_ver_id
FROM nbts.log where event_id=‘150002‘ and log_id =‘a2a421734c7e47dd8a8b‘;
截取log_data從逗號開始之前的字符:
SELECT SUBSTR(log_data,0,INSTR(log_data, ‘,‘, 1, 1) - 1) AS app_ver_id
FROM nbts.log where event_id=‘150002‘ and log_id =‘a2a421734c7e47dd8a8b‘;
字符串格式化
mysql:CONCAT
oracle:TO_CHAR
主鍵長度問題
在遷移到mysql后可能會出現(xiàn)主鍵長度太短,需要增加長度。
http://www.cnblogs.com/kunpengit/p/4462656.html
原文:http://www.cnblogs.com/softidea/p/5309299.html
總結
以上是生活随笔為你收集整理的oracle转mysql总结经验,oracle转mysql总结(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 58同城多少钱啊?
- 下一篇: 监控mysql锁定状态_MySQL 锁的