Obecně: sloučení dvou DB záznamů do jednoho
- Kamil Valenta
- Člen | 815
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:
- LOCK tabulky s PK, disable na FK check
- Shodit autoincrement, dropnout PK, nahradit ho obyčejným indexem
- enable na FK check
- UPDATE id uzivatele (už není PK, takže projde), FK cascade on update propíše změny
- disable na FK check
- DELETE duplicitního uživatele
- ADD PK, DROP obyčejného klíče, vrácení autoincrement na PK
- enable na FK check
- 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 | 516
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.