oracle轉mysql總結
ares-sdk初始開發測試使用的是oracle數據庫,由於寧波通商的特殊需要,必須把數據庫環境從oracle轉向mysql。 現對轉換過程中出現的問題及經驗總結如下:
主鍵生成策略
創建一個專門記錄序列的表sequence,記錄有當前序列號,序列的間隔如+1
創建記錄當前序列的表
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);
創建一個獲取當前序列的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;
獲取下一個數值..先在sequence里面調用update當前最大數值+1然后再調用currval獲得當前數值
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 ;
如果以上語句執行有異常請先執行這句: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函數
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中一般情況下不區分大小寫
但在MySQL中,所使用操作系統的大小寫敏感性決定了數據庫名和表名的大小寫敏感性。
解決的辦法是把mysql的數據庫名和oracle的大小寫保持一致,
表名與應用程序中sql字符串中的表名保持一致,
如果應用程序中字段名用了雙引號,那請把sql中的字段名大小寫與雙引號里的字符保持一致。
如果你的應用程序所引用的表名、字段沒有統一大小寫,那麻煩就大了。
字符串截取
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后可能會出現主鍵長度太短,需要增加長度。