oracle转mysql总结

   

主键生成策略

创建一个专门记录序列的表sequence,记录有当前序列号,序列的间隔如+1

创建记录当前序列的表
CREATE TABLE `sequence` (
  `name` VARCHAR(50) NOT NULL,
  `current_value` INT(11) NOT NULL,
  `increment` INT(11) NOT NULL DEFAULT '1',
  `minvalue` INT(11) DEFAULT '1',
  `maxvalue` BIGINT(11) DEFAULT NULL,
  `cycle` INT(11) DEFAULT '0',
  PRIMARY KEY (`name`)
) ENGINE=INNODB DEFAULT CHARSET=utf8



创建一个获取当前序列的function
DROP FUNCTION IF EXISTS currval;DELIMITER $$


USE `orcl`$$


DROP FUNCTION IF EXISTS `currval`$$


CREATE DEFINER=`root`@`localhost` FUNCTION `currval`(seq_name VARCHAR(50)) RETURNS int(11)
BEGIN
  DECLARE VALUE INTEGER;
  SET VALUE = 0;
  SELECT current_value INTO VALUE
  FROM sequence
  WHERE NAME = seq_name;
  RETURN VALUE;
END$$


DELIMITER ;

获取下一个数值..先在sequence里面调用update当前最大数值+1然后再调用currval获得当前数值
DELIMITER $$


USE `orcl`$$


DROP FUNCTION IF EXISTS `nextval`$$


CREATE DEFINER=`root`@`localhost` FUNCTION `nextval`(seq_name VARCHAR(50)) RETURNS INT(11)
BEGIN
	
  DECLARE MAXVAL INTEGER DEFAULT 999999999;
  DECLARE FLAGS INTEGER ;
  DECLARE MINVAL INTEGER DEFAULT 1;
  DECLARE CURVAL INTEGER ;
  SELECT `current_value` INTO CURVAL 
  FROM sequence
  WHERE NAME = seq_name;   
  
  SELECT `maxvalue` INTO MAXVAL
  FROM sequence
  WHERE NAME = seq_name;  
   
  SELECT `cycle` INTO FLAGS
  FROM sequence
  WHERE NAME = seq_name;   
  SELECT `minvalue` INTO MINVAL
  FROM sequence
  WHERE NAME = seq_name;   
  
   IF (FLAGS='1')AND (CURVAL>=MAXVAL)
   THEN
    UPDATE sequence
   SET          current_value = MINVAL
   WHERE NAME = seq_name;
   ELSE
	   UPDATE sequence
	   SET          current_value = current_value + increment
	   WHERE NAME = seq_name;
   END IF;
   
   RETURN currval(seq_name);
END$$


DELIMITER ;

DROP FUNCTION IF EXISTS setval;
DELIMITER $$


USE `orcl`$$


DROP FUNCTION IF EXISTS `setval`$$


CREATE DEFINER=`root`@`localhost` FUNCTION `setval`(seq_name VARCHAR(50), VALUE INTEGER) RETURNS INT(11)
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后可能会出现主键长度太短,需要增加长度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值