Obecně: sloučení dvou DB záznamů do jednoho

Kamil Valenta
Člen | 762
+
0
-

Ahoj.
Jak, prosím, řešíte sloučení dvou PK do jednoho? Typicky může jít o tabulku uživatelů. Uživatel se zaregistruje, vzniká mu hromada záznamů s FK. Za rok zapomene, že má účet, zaregistruje si jiný, vznikne mu druhá hromada záznamů s novým FK. Pak si vzpomene, že už účet měl a potřeboval by účty sloučit.

Jedna možnost je updatnout všechny ref. tabulky a popřepisovat FK na jedno z těch dvou PK.
Nevýhoda je, že se v této rutině budou muset vyjmenovat všechny ref. tabulky, což bude neudržitelné (při každé migraci DB se bude muset aktualizovat i tato rutina, dřív nebo později někdo zapomene…)

Druhá možnost, která mne napadá, je v maximální míře využít vlastnosti FK (všechny mají u update cascade).
Transakce:

  1. LOCK tabulky s PK, disable na FK check
  2. Shodit autoincrement, dropnout PK, nahradit ho obyčejným indexem
  3. enable na FK check
  4. UPDATE id uzivatele (už není PK, takže projde), FK cascade on update propíše změny
  5. disable na FK check
  6. DELETE duplicitního uživatele
  7. ADD PK, DROP obyčejného klíče, vrácení autoincrement na PK
  8. enable na FK check
  9. UNLOCK

Když to zkouším na testovacích datech, tak to funguje dobře. Nevím ale, jak se takové čachry s PK zachovají nad tisíci záznamů. A nepřehlédl jsem něco?

Díky za tipy.

nightfish
Člen | 472
+
+5
-

Kamil Valenta napsal(a):
Jedna možnost je updatnout všechny ref. tabulky a popřepisovat FK na jedno z těch dvou PK.
Nevýhoda je, že se v této rutině budou muset vyjmenovat všechny ref. tabulky, což bude neudržitelné (při každé migraci DB se bude muset aktualizovat i tato rutina, dřív nebo později někdo zapomene…)

Osobně bych tohle řešil na úrovni PHP – dotazem do schématu (mySQL, Postgres) si najít všechny tabulky/sloupce, která obsahují FK na tabulku uživatelů, a v cyklu je poaktualizovat.