达梦空格填充导致违反唯一约束问题排查及处理
在oracle迁移到达梦过程中,创建主键提示违法唯一约束。如下所示:
用户反馈没有重复数据
原因是达梦空格填充模式参数(BLANK_PAD_MODE)为0 , 查询语句将忽略字符串的后缀空格,由于大部分其他都已经迁移过去,只有个别表报错,不能重新初始化实例,需要将有问题的数据查找出来删除
查找重复数据
SELECT A.NAME ,COUNT(*) N FROM (SELECT TRIM(NAME) NAME FROM TEST)A GROUP BY A.NAME ORDER BY N DESC;
还有一种是ROW_NUMBER() OVER 函数查找重复数据
select * from
(SELECT name,row_Number() over(partition by name ORDER by 1 desc)rn from test
) t where t.rn>1
将上面的重复字段随便找一条看下字段长度区别
根据rowid来删除重复数据
delete from test where rowid in (select rowid from
(SELECT name, row_Number() over(partition by name ORDER by 1 desc)rn from test
) t where t.rn>1)
删除之后,查看以前的重复数据值,可以看到只有一台数据了
重复值删除之后,能成功创建主键