最近在Oracle迁移到达梦中遇到一个组合主键的问题,Oracle中该表已经是组合主键的结构,在迁移的数据到达梦后建立组合主键时报错违反唯一性约束,接下来与大家一起分享下这个问题
构建Oracle中的创建测试表
oracle中表结构的创建如下
create table test01
(
"ID" int not null,
"NAME" VARCHAR(20) not null,
primary key("ID","NAME")
);
插入两条测试数据
insert into test01 values (1,'A');
insert into test01 values (1,'A ');
在Oracle中以上是可以正常执行插入的,接下来使用达梦迁移工具迁移到达梦中
迁移表数据到达梦
使用达梦迁移工具进行迁移
可以看见在添加主键约束的时候失败了,查看具体的报错为违反唯一性约束
刚开始遇到这个问题的时候,怀疑是Oracle那边的数据有重复的,于是在Oracle端排查数据是否有重复的问题
select id,name,count(*) from test01 group by id,name having count(*) >1;
并没有发现有重复的数据,于是到达梦这边也使用这条语句进行查询,结果也是没有重复数据
接下来在达梦这边先用同样的语句创建好表结构,在进行迁移数据
先使用语句在达梦中创建好表结构,再迁移数据
create table test01
(
"ID" int not null,
"NAME" VARCHAR(20) not null,
primary key("ID","NAME")
);
结果还是报错违反唯一性约束,后续仔细检查后发现,问题数据正如同我上面创建的测试数据一样,‘A’ 与 ‘A ’的差别
执行以下sql查询:
select trim(id),trim(name),count(*) from test01 group by trim(id),trim(name) having count(*) >1;
达梦与Oracle中的结果都是一样,证明迁移工具迁移数据时并没有做trim的处理,但在创建主键的时候,达梦中确报错了违反唯一性约束
将达梦中这条’A’ 与’A ’ 的数据中的一条进行删除后,再次创建主键,成功,问题就出在这两条数据中,第二个’A '中后面接了一个空格,导致达梦中的主键创建失败