分享一下最近遇到的一个问题,我们从一个数据表中将数据表中的数据同步到另一个数据库的表中,由于要同步的数据表中没有建主键,所以数据同步后发现同步的数据比原始数据表中的数据要多,有不少重复的数据。因此需要对数据表进行去重后,创建主键。而数据表中没有一个字段可以作为主键,需要用多个字段创建联合主键。
由于同步的数据表在生产数据库中,为了安全考虑不能直接在表中直接删除数据,需要先在临时表中进行操作,操作命令检查没问题后再在生产表中操作。
操作步骤如下:
- 根据生产表创建临时表;
- 查询临时表重复数据;
- 删除临时表中的重复数据;
- 核实去重后的临时表与原始数据表数据是否一致;
- 创建联合主键;
- 临时表操作无误后,再在生产数据表中去重及创建联合主键操作。
第一步:根据生产表创建临时表
命令如下:
create table tmp_cux_values as select * from cux_values t;
第二步:查询临时表重复数据
根据联合主键的字段进行查重,
命令如下:
select t.cux_name,t.cux_value,t.description,count(1),max(rowid)
from tmp_cux_values t
group by t.cux_name,t.cux_value,t.description
having count(1)> 1;
第三步:删除临时表中的重复数据
命令如下:
delete from tmp_cux_values t
where rowid not in (
select max(rowid) from tmp_cux_values t
group by t.cux_name,t.cux_value,t.description
);
第四步:核实去重后的临时表与原始数据表数据是否一致;
查询去重后的数据表中的数据,与原始数据表比对,数据无误后,在进行创建联合主键。如果数据有误,则需要查询数据不一致的原因。
第五步:创建联合主键
命令如下:
alter table tmp_cux_values
add constranintes pk_cux_name_value_des
primary key (cux_name,cux_value,description);
注:创建联合主键的语法:
alter table 表名称
add constranintes 联合主键名称
primary key (字段1,字段2,字段3, ...);