Per tagliare un database di produzione per il caricamento in un sistema di test, abbiamo eliminato righe in molte tabelle. Questo ci ha lasciato con cruft in un paio di tavoli, vale a dire le righe che non sono più utilizzate in nessuna relazione FK. Quello che voglio ottenere è come la garbage collection in Java.Elimina tutte le righe di tutte le tabelle che non sono più utilizzate in nessuna relazione FK
O per dirla in un altro modo: Se ho tabelle M nel database. N di essi (vale a dire la maggior parte ma non tutti) hanno relazioni con le chiavi estranee. Ho eliminato un paio di righe di alto livello (vale a dire che hanno solo relazioni FK in uscita) tramite SQL. Questo lascia le righe solo nelle tabelle correlate.
Qualcuno ha una procedura memorizzata SQL o un programma Java che trova le tabelle N e quindi segue tutte le relazioni FK per eliminare le righe che non sono più necessarie.
Se trovassi le tabelle N troppo complesse, potrei probabilmente fornire allo script un elenco di tabelle da analizzare o, preferibilmente, un elenco negativo di tabelle da ignorare.
Si noti inoltre:
- Abbiamo alcune tabelle che vengono utilizzati in molti (> 50) Relazioni FK, vale a dire
A
,B
,C
, ... tutte le righe di utilizzo inZ
. - Tutte le relazioni FK utilizzano la colonna tecnica PK, che è sempre una singola colonna.
Questa domanda mostra come raccogliere le informazioni relative FK: http://stackoverflow.com/questions/ 273794/mysql-how-to-determinare-foreign-key-relations-programmaticamente –
Questa domanda spiega come eliminare tutte le righe relative a una singola relazione FK: http://stackoverflow.com/questions/3164840/mysql-attempting-to -delete-all-rows-which-are-not-constrained-by-foreign-key –
SQL dinamico in stored procedure: http://stackoverflow.com/questions/190776/how-to-have-dynamic-sql-in-mysql-stored-procedure –