欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

记录一次mysql 与orcale 适配过程

程序员文章站 2022-04-19 12:41:04
记录一次mysql 与orcale 适配过程1.mysql表导入orcale 使用navicat传输工具2.导出的.sql文件中 表名和字段名自动加了" " 去除双引号,去除navicat中多余的注释,我这边导出的sql文件中没有默认值,加上默认值。注意orcale中date的默认值是sysdate,plsql中执行文件建表。表建好以后发现很多坑:(1) 主键不能自增###创建sequence create sequence t_user_autoinc_seq minv...

记录一次mysql 与orcale 适配过程

1.mysql表导入orcale 使用navicat传输工具
记录一次mysql 与orcale 适配过程
2.导出的.sql文件中 表名和字段名自动加了" " 去除双引号,去除navicat中多余的注释,我这边导出的sql文件中没有默认值,加上默认值。注意orcale中date的默认值是sysdate,plsql中执行文件建表。表建好以后发现很多坑:
(1) 主键不能自增

###创建sequence
 create sequence t_user_autoinc_seq
         minvalue 1
         maxvalue 99999999
         start with 1
         increment by 1
         nocycle
         nocache
         order;
  
  ###t_user 是表名    t_user_trigger是新建的触发器                     
 create or replace trigger t_user_trigger
	before insert on t_user for each row
begin
	select t_user_autoinc_seq.nextval into :new.id from dual;
end t_user_autoinc_tg;
###每张表都得创建sequence和trigger
(2)更新时间不能自动更新
###更新时间创建触发器就好了
create or replace trigger t_user_info_trigger
before update on t_user for each row
begin
     :new.MODIFIED_DATE := sysdate;
end;

3.到这表这块没啥问题了,这边项目中用的mybatis,下边是mybatis中遇到的坑以及解决方案
(1)配置mybatis默认值

<!--设置当JDBC类型为空时,某些驱动程序 要指定值,default:OTHER -->
        <setting name="jdbcTypeForNull" value="NULL"/> 

(2)sql差异

a.不能用as 做别名
b.cancat只能拼接2个字符,需要多个  需要多个concat拼接
c.orcale中group by 分组字段必须在select中
d.单条insert返回主键问题
 <selectKey resultType="java.lang.Integer" order ="AFTER" keyProperty="id" keyColumn="id">
            select T_DATASOURCE_AUTOINC_SEQ.Currval from dual
  </selectKey>
  ### T_DATASOURCE_AUTOINC_SEQ创建主键自增的seq
e.批量插入
<insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="false" keyProperty="id">
        INSERT ALL
        <foreach collection="list" item="item" index="index" >
            into t_XXX (creater, modifier )
            values
            (
            #{item.creater,jdbcType=VARCHAR}, #{item.modifier,jdbcType=VARCHAR}
            )
        </foreach>
        select 1 from dual
    </insert>

f.批量insert or update

<insert id="batchInsertOrUpdate" parameterType="java.util.List" useGeneratedKeys="false" keyProperty="id">
		MERGE INTO t_user t USING(
		<foreach collection="list" item="item" index="index" separator="UNION ALL" >
			SELECT
			#{item.userId,jdbcType=VARCHAR} user_id, #{item.age,jdbcType=INTEGER} age
			 FROM DUAL
		</foreach>)
		### 唯一键约束
		 t1 on (t.user_id=t1.user_id)
		WHEN MATCHED THEN
		UPDATE SET
			t.age=t1.age
		WHEN NOT MATCHED THEN
			insert(user_id, age)
			values(t1.user_id, t1.age)
	</insert>

orcale 分页差异 mysql limit orcale使用rownum
项目中可以使用开源的pagehelper适配mysql与orcale。

ps. 后续肯定还有很多问题,目前暂时就发现这些。

本文地址:https://blog.csdn.net/qq_36275012/article/details/107104397