记录一次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传输工具
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