• 数据库迁移,从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 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下一个值
  • 相关阅读:
    寻找我的黑客偶像
    20201215 《信息安全专业导论》第三周学习总结
    罗马数字
    base编码
    20201215 王馨瑶 第2周学习总结
    罗马数字转阿拉伯数字
    2020-2021-1 20201226 《信息安全专业导论》第三周学习总结
    IEEE754 浮点数
    Base64
    2020-2021-1 20201226 《信息安全专业导论》第2周学习总结
  • 原文地址:https://www.cnblogs.com/t96fxi/p/12786553.html
Copyright © 2020-2023  润新知