今天,发现有很多员工的五险一金数据不能修改,一点击修改按钮就报错
这里发现查询是可以的,展示出来后选中一条数据,点击"修改"按钮,就报500了
而正常情况应该是这样子:
检查对比了一好一坏两条数据的各个字段,发现"有效状态"都是"有效",而且有效起期和止期也都是正常的,且一模一样
并且发现浏览器控制台报错是这个接口500,但是有一些数据是可以正常访问的啊,为什么这个不行?直接报500
,这里看了接口后需要反思一下 ,调这个五险一金修改接口的时候, 相当于是需要通过传过来的主键查询到数据(实体类),再把这条数据的详情数据展示在详情页面, 供于参考并支持修改提交即保存。这里将其数据进行显示就开始报错,说明这条数据把主键id传过来进行查询的时候就有问题了,
所以这里先去取一下查询结果中这条数据的主键:
详细信息:、
去库里五险一金表,通过主键查一下 :
发现有两个人的五险一金数据居然使用的同一个主键!!!!!
难怪一到修改的时候,展示五险一金详情数据的时候就报错了,原来是查询的时候,会查出10条数据,给页面去展示,这里都不会出问题,而当用户选中某一条数据,进行修改操作时,就报500了,这是因为选的这条数据的主键已经和另一条数据重复了,拿这个主键调修改时详情页面的接口时就报错了,因为里面根据主键查询返回时接收的是一个实体类,所以需要去把重复主键等数据解决掉
先通过SQL一查,居然居然一百多条是重复的,乘二也就是三百多条数据点击会报500!难怪大片的五险一金数据报错。。。。。。
select 主键,count(1) from 表名
group by 主键
having count(1)>1
解决主键重复具体方法如下:
一 主键重复处理步骤
/**查询键值重复**/
select key,count(1) from table
group by key
having count(1)>1
---重复主键的处理(删除主键-删除重复数据-添加主键)
1-----------删除主键-------------
ALTER TABLE BANCS_INVS_F
DROP PRIMARY KEY ;
2----------根据rowid,rownum删除重复数据-------------
DELETE BANCS_INVS_F D WHERE D.ROWID IN(
SELECT S.ROWID FROM(
SELECT ROWID,ROW_NUMBER()OVER(PARTITION BY INVS_SOC_NO,AD04_MASTER_AC_NO,CD04_ACCT_TYPE,CD04_INT_CATE,AD04_SUB_AC ORDER BY AD04_MASTER_AC_NO) AS ORDER_KEY FROM BANCS_INVS_F
)S
WHERE ORDER_KEY >= 2
)
3-----------添加主键--------------------
ALTER TABLE BANCS_INVS_F
ADD PRIMARY KEY (INVS_SOC_NO,AD04_MASTER_AC_NO,CD04_ACCT_TYPE,CD04_INT_CATE,AD04_SUB_AC);
二 删除重复记录的3种方法
2 3可处理数据完全一样的记录
1 delete from table a
where exists(select null from table b where b.name=a.name and b.x>a.x)(根据列x不同)
2 delete from table a
where exists(select null from table b where b.name=a.name and b.rowid>a.rowid)(同方法一只是用rowid替代x)
3 delete from table
whre rowid in
(
select rowid from (select rowid,row_number()over(partition by name order by id) as seqno)
where seqno>1
);