oracle轉mysql總結


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后可能會出現主鍵長度太短,需要增加長度。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM