Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Bảng dọn dẹp MySQL khỏi các mục nhập trùng lặp VÀ liên kết lại FK trong bảng tùy thuộc

Đây là cách tôi đã làm.

Tôi đã sử dụng lại một trường không sử dụng trong patient bảng để đánh dấu bệnh nhân không trùng lặp (N), bệnh nhân đầu tiên của bệnh nhân bị trùng lặp (X) và các bệnh nhân được sao chép khác (Y). Bạn cũng có thể thêm một cột cho mục này (và bỏ nó sau khi sử dụng).

Dưới đây là các bước tôi đã làm để dọn dẹp cơ sở dữ liệu của mình:

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

Chắc chắn có một cách ngắn hơn, với một số SQL thông minh hơn (phức tạp?), Nhưng cá nhân tôi thích cách đơn giản hơn. Điều này cũng cho phép tôi kiểm tra từng bước đang thực hiện những gì tôi mong đợi.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Doctrine 2 DQL MySQL tương đương với ROUND ()?

  2. Cảnh báo:mysql_num_rows () mong đợi tham số 1 là tài nguyên, boolean đã cho

  3. MySQL kết hợp hai cột và thêm vào một cột mới

  4. Danh sách các chỉ định định dạng ngày trong MySQL

  5. Xóa các hàng trùng lặp khỏi bảng