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

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 INTEGERLANGUAGE SQL DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER COMMENT ‘‘BEGINDECLARE value INTEGER; SET value = 0; SELECT current_value INTO value FROM sequenceWHERE name = seq_name; RETURN value; END$ DELIMITER ;--下个值DROP FUNCTION IF EXISTS nextval; DELIMITER $ CREATE FUNCTION nextval (seq_name VARCHAR(50)) RETURNS INTEGERLANGUAGE SQL DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER COMMENT ‘‘BEGINUPDATE sequenceSET 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 INTEGERLANGUAGE SQL DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER COMMENT ‘‘BEGINUPDATE sequenceSET 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 的初始值为10SELECT CURRVAL(‘TestSeq‘); --查询指定sequence的当前值 这里是获取TestSeq当前值SELECT NEXTVAL(‘TestSeq‘); --查询指定sequence的下一个值 这里是获取TestSeq下一个值

相关文章