从重复的条目进行MySQL清理表,并在相关表中重新链接FK
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了从重复的条目进行MySQL清理表,并在相关表中重新链接FK,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2830字,纯文字阅读大概需要5分钟。
内容图文
这是我的情况:我有2张桌子,病人和书房.
每个表都有使用自动增量的自己的PK.
就我而言,pat_id应该是唯一的.在某些数据库用途中,它不是唯一的,因为它在某些用途上可能不是唯一的(它不是自制系统).我发现了如何配置系统以将pat_id视为唯一的,但是现在我需要清除数据库以查找重复的患者,并在删除重复的患者之前将研究表中的重复患者重新链接到其余唯一患者.
患者表:
CREATE TABLE `patient` (
`pk` BIGINT(20) NOT NULL AUTO_INCREMENT,
`pat_id` VARCHAR(250) COLLATE latin1_bin DEFAULT NULL,
...
`pat_name` VARCHAR(250) COLLATE latin1_bin DEFAULT NULL,
...
`pat_custom1` VARCHAR(250) COLLATE latin1_bin DEFAULT NULL
....
PRIMARY KEY (`pk`)
)ENGINE=InnoDB;
学习表:
CREATE TABLE `study` (
`pk` BIGINT(20) NOT NULL AUTO_INCREMENT,
`patient_fk` BIGINT(20) DEFAULT NULL,
...
PRIMARY KEY (`pk`),
...
CONSTRAINT `patient_fk` FOREIGN KEY (`patient_fk`) REFERENCES `patient` (`pk`)
)ENGINE=InnoDB;
我发现了一些类似的问题,但不是完全相同的问题,尤其是缺少外键与其余唯一患者的链接.
Cleanup Update for Duplicate Entries
Update only first record from duplicate entries in MySQL
解决方法:
我就是这样
我重用了患者表中未使用的字段,以标记未重复的患者(N),重复的患者第1(X)和其他重复的患者(Y).您也可以为此添加一列(使用后将其删除).
这是我清理数据库所遵循的步骤:
/*1: List duplicated */
select pk,pat_id, t.`pat_id_issuer`, t.`pat_name`, t.pat_custom1
from patient t
where pat_id in (
select pat_id from (
select pat_id, count(*)
from patient
group by 1
having count(*)>1
) xxx);
/*2: Delete orphan patients */
delete from patient where pk not in (select patient_fk from study);
/*3: Reset flag for duplicated (or not) patients*/
update patient t set t.`pat_custom1`='N';
/*4: Mark all duplicated */
update patient t set t.`pat_custom1`='Y'
where pat_id in (
select pat_id from (
select pat_id, count(*)
from patient
group by 1
having count(*)>1
) xxx) ;
/*5: Unmark the 1st of the duplicated*/
update patient t
join (select pk from (
select min(pk) as pk, pat_id from patient
where pat_custom1='Y'
group by pat_id
) xxx ) x
on (x.pk=t.pk)
set t.`pat_custom1`='X'
where pat_custom1='Y'
;
/*6: Verify update is correct*/
select pk, pat_id,pat_custom1
from `patient`
where pat_custom1!='N'
order by pat_id, pat_custom1;
/*7: Verify studies linked to duplicated patient */
select p.* from study s
join patient p on (p.pk=s.patient_fk)
where p.pat_custom1='Y';
/*8: Relink duplicated patients */
update study s
join patient p on (p.pk=s.patient_fk)
set patient_fk = (select pk from patient pp
where pp.pat_id=p.pat_id and pp.pat_custom1='X')
where p.pat_custom1='Y';
/*9: Delete newly orphan patients */
delete from patient where pk not in (select patient_fk from study);
/* 10: reset flag */
update patient t set t.`pat_custom1`=null;
/* 11: Commit changes */
commit;
当然,有一种更短的方法,带有一些更聪明的(复杂的)SQL,但是我个人更喜欢这种简单的方法.这也使我可以检查每个步骤是否正在执行我期望的工作.
内容总结
以上是互联网集市为您收集整理的从重复的条目进行MySQL清理表,并在相关表中重新链接FK全部内容,希望文章能够帮你解决从重复的条目进行MySQL清理表,并在相关表中重新链接FK所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。