Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Tabel pembersihan MySQL dari entri yang digandakan DAN menautkan kembali FK di tabel tergantung

Inilah yang saya lakukan.

Saya menggunakan kembali bidang yang tidak digunakan di patient tabel untuk menandai pasien tidak duplikat (N), pasien duplikat pertama (X), dan pasien duplikat lainnya (Y). Anda juga dapat menambahkan kolom untuk ini (dan menghapusnya setelah digunakan).

Berikut adalah langkah-langkah yang saya ikuti untuk membersihkan database saya:

/*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;

Tentu saja ada cara yang lebih pendek, dengan SQL yang lebih cerdas (rumit?), tetapi saya pribadi lebih suka cara yang sederhana. Ini juga memungkinkan saya untuk memeriksa setiap langkah melakukan apa yang saya harapkan.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Fungsi MySQL SIGN() – Cari Tahu Apakah Angka Positif atau Negatif di MySQL

  2. Isi JFreechart TimeSeriesCollection dari Mysql DB?

  3. MySql - Bagaimana cara mendapatkan nilai di baris sebelumnya dan nilai di baris berikutnya?

  4. Bagaimana cara membuat driver Qt mysql di windows?

  5. Alat diagram ER open source untuk mysql