数据库迁移,从oracle到mysql的sql修改

点滴技术生活 2020-04-27

1.函数修改

字符串转时间的函数: to_date(#{createEndTime},‘yyyy/mm/dd‘) ===>str_to_date(#{createBeginTime},‘%Y/%m/%d‘)
时间转字符串的函数: to_char(OPERATE_TIME,‘yyyy-MM-dd hh24:mi:ss‘)====> date_format(OPERATE_TIME,‘%Y-%m-%d %H:%i:%S‘)

字符串连接函数:        ‘%‘||#{name}||‘%‘  ===== >CONCAT(‘%‘,#{name},‘%‘)

获取当前时间函数:    sysdate =========>   now()

2.序列

有些主键ID使用序列,mysql没有序列但是有auto_increment字段

2.1  将字段修改为自增

ALTER TABLE T_BLOGROLL_INFO MODIFY id INT AUTO_INCREMENT;

插入时: nextval ----》 null

但是有的insert语句,有两个字段使用了序列, mysql一个表只能主键使用自增,所以考虑模拟序列

2.2 模拟序列

使用表和函数模拟

--新建序列
DROP TABLE IF EXISTS sequence; 
CREATE TABLE sequence ( 
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NOT NULL, 
current_value INT NOT NULL, 
increment INT NOT NULL DEFAULT 1, 
PRIMARY KEY (name) 
) ENGINE=InnoDB;

--当前值
DROP FUNCTION IF EXISTS currval; 
DELIMITER $ 
CREATE FUNCTION currval (seq_name VARCHAR(50)) 
RETURNS INTEGER
LANGUAGE SQL 
DETERMINISTIC 
CONTAINS SQL 
SQL SECURITY DEFINER 
COMMENT ‘‘
BEGIN
DECLARE value INTEGER; 
SET value = 0; 
SELECT current_value INTO value 
FROM sequence
WHERE name = seq_name; 
RETURN value; 
END
$ 
DELIMITER ;

--下个值
DROP FUNCTION IF EXISTS nextval; 
DELIMITER $ 
CREATE FUNCTION nextval (seq_name VARCHAR(50)) 
RETURNS INTEGER
LANGUAGE SQL 
DETERMINISTIC 
CONTAINS SQL 
SQL SECURITY DEFINER 
COMMENT ‘‘
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
LANGUAGE SQL 
DETERMINISTIC 
CONTAINS SQL 
SQL SECURITY DEFINER 
COMMENT ‘‘
BEGIN
UPDATE sequence
SET current_value = value 
WHERE name = seq_name; 
RETURN currval(seq_name); 
END
$ 
DELIMITER ;

 使用

INSERT INTO sequence VALUES (‘TestSeq‘, 0, 1);
----添加一个sequence名称和初始值,以及自增幅度  添加一个名为TestSeq 的自增序列

SELECT SETVAL(‘TestSeq‘, 10);
---设置指定sequence的初始值    这里设置TestSeq 的初始值为10

SELECT CURRVAL(‘TestSeq‘);  
--查询指定sequence的当前值   这里是获取TestSeq当前值

SELECT NEXTVAL(‘TestSeq‘);  
--查询指定sequence的下一个值  这里是获取TestSeq下一个值

相关推荐