Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL таблица за почистване от дублирани записи И повторно свързване на FK в зависимост от таблицата

Ето как направих.

Използвах повторно неизползвано поле в patient таблица за отбелязване на недублирани (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, но аз лично предпочитам простия начин. Това също ми позволява да проверя дали всяка стъпка прави това, което очаквам.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Има ли причина да се притеснявате за реда на колоните в таблица?

  2. Грешка при подготвени изявления на Java MYSQL:Проверете синтаксиса за използване близо до '?' на ред 1

  3. Как да разберете потребителското име и паролата за mysql база данни

  4. Създаване на временни таблици в MySQL Stored Procedure

  5. get_result() Не работи, дори mysqlnd е активиран