Ho 4 tavoli. Nella prima tabella ha appid come chiave primaria e in altre tre la sua chiave esterna. Voglio cancellare i dati da tutti e tre in una query. Ho fatto del mio meglio ma ho fallito. Qualcuno può aiutare?Elimina record da più tabelle contemporaneamente?
risposta
Non è possibile scrivere un'istruzione di eliminazione che faccia riferimento a più di una tabella, è necessario scrivere 4 istruzioni di eliminazione.
Tuttavia, se appropriato, è possibile definire le chiavi esterne sulle 3 tabelle figlio su "ON DELETE CASCADE". Quindi, quando si elimina dalla tabella padre, vengono eliminate anche tutte le righe associate dalle 3 tabelle figlio. Questo può essere utile a volte, ma non lo raccomanderei come pratica generale in quanto può essere pericoloso e confuso per gli sviluppatori.
Puoi per favore approfondire la natura pericolosa e confusa delle chiavi esterne a cascata? Perché sono un po 'sorpreso da questa osservazione. – Rene
@Rene, OK bene come succede Attualmente lavoro su un progetto in cui qualcuno ha impostato molte chiavi esterne come ON DELETE CASCADE. Ad esempio, se un utente fa qualcosa come "DELETE order_status_lookup WHERE status_code = 'SHIPPED'" allora succede e tutti gli ordini con lo stato' SHIPPED 'vengono cancellati. Lo chiamo ma pericoloso! In realtà uso ON DELETE CASCADE, ma solo dove ha davvero senso. –
Quindi quello che stai dicendo è che si tratta di uno strumento che può essere molto utile ma utilizzato in modo sbagliato può causare danni. Un po 'come una motosega non è vero? Ma consiglieresti di abbattere manualmente tutti quegli alberi? – Rene
Non esiste alcun modo per eliminare da più tabelle con una singola istruzione, ma la domanda migliore è perché è necessario eliminare contemporaneamente tutte le tabelle? Mi sembra che tu non capisca appieno come funzionano le transazioni in Oracle.
Consente di accedere ed eliminare una riga dalla tabella 1, ma non eseguire il commit. Per quanto riguarda tutte le altre sessioni, quella riga non è stata cancellata. Se apri un'altra connessione e esegui una query per la riga, sarà comunque presente.
Quindi si elimina dalle tabelle 2, 3 e 4 a turno. Non hai ancora eseguito il commit della transazione, quindi tutte le altre sessioni nel database possono ancora vedere le righe eliminate.
Quindi si commette.
Allo stesso tempo, le altre sessioni non vedranno più le righe eliminate dalle 4 tabelle, anche se le eliminazioni sono state effettuate in 4 istruzioni separate.
Penso che tu sia un po 'severo. Riesco a vedere il merito in una sintassi 'DELETE ALL' analoga a' INSERT ALL': sarebbe utile zappare tutti i record correlati in un set di tabelle senza doversi preoccupare delle dipendenze e senza utilizzare i vincoli posticipati. (Anche se ammetto che il mio bisogno è di solito per gestire i dati di test piuttosto che negli ambienti di produzione). – APC
+1 Per una risposta chiara e diretta. – Rene
Se il database è Mysql, è possibile utilizzare join in ELIMINA istruzione. Vedere http://dev.mysql.com/doc/refman/5.0/en/delete.html per maggiori informazioni.
Ma non lo è. È Oracle. –
Oltre a un altro commento (transazione o utilizzando Elimina cascata) è possibile utilizzare il trigger per eliminare dalle tabelle figlio. –
- 1. Elimina tutti i record correlati da più tabelle
- 2. elimina righe da più tabelle
- 3. Aggiornare più record contemporaneamente usando SailsJS
- 4. Elimina più record dalla console di Rails
- 5. Elimina tutte le stored procedure contemporaneamente
- 6. Elimina da 2 tabelle utilizzando INNER JOIN
- 7. Elimina record in Doctrine
- 8. MySql aggiorna due tabelle contemporaneamente
- 9. MySQL seleziona due tabelle contemporaneamente
- 10. Come posso salvare più record contemporaneamente in Rails?
- 11. Elimina record duplicati in base a più colonne
- 12. Elimina dati dalle tabelle dipendenti
- 13. Rails 3 - Elimina più record usando le caselle di controllo
- 14. Elimina più record per elenco di ID con istruzione HQL
- 15. sqlite3 seleziona da più tabelle "dove" roba
- 16. Codeigniter: selezionare da più tabelle
- 17. come modificare molti record contemporaneamente in phpmyadmin
- 18. SSRS esegue più query contemporaneamente?
- 19. ELIMINA i dati da una tabella, unendo attraverso due tabelle
- 20. Elimina righe da due tabelle in una query
- 21. Elimina dati da tutte le tabelle in MYSQL
- 22. creare il modulo per aggiungere record in più tabelle
- 23. Come si inseriscono i record contemporaneamente in due tabelle del database?
- 24. Elimina righe da più tabelle utilizzando una singola query (SQL Express 2005), con una condizione WHERE
- 25. SELEZIONA quindi elimina immediatamente il record mysql
- 26. Elimina tutti i record tabella azzurrata
- 27. sailsjs elimina/aggiorna più righe
- 28. Elimina record di SQL Server 2005 senza registrazione
- 29. Elimina tutti i record in NSManagedObjectContext
- 30. Elimina record padre se figlio non presente
Questo è il problema che l'azione referenziale 'ON DELETE CASCADE' è stata inventata per risolvere. A differenza di @ Tony Andrews, lo raccomando come pratica generale. – onedaywhen