Mysql: elimina da più tabelle con una query

Ho 4 tabelle che memorizzano informazioni diverse su un utente in ciascuna. Ogni tabella ha un campo con user_id per identificare quale riga appartiene a quale utente. Se voglio cancellare l’utente è questo il modo migliore per cancellare le informazioni degli utenti da più tabelle? Il mio objective è farlo in una query.

Query:

"DELETE FROM table1 WHERE user_id='$user_id'; DELETE FROM table2 WHERE user_id='$user_id'; DELETE FROM table3 WHERE user_id='$user_id'; DELETE FROM table4 WHERE user_id='$user_id';"; 

È ansible definire vincoli di chiave esterna sulle tabelle con l’opzione ON DELETE CASCADE .

Quindi l’eliminazione del record dalla tabella padre rimuove i record dalle tabelle figlio.

Controlla questo link: http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

Apparentemente, è ansible. Dal manuale :

È ansible specificare più tabelle in un’istruzione DELETE per eliminare righe da una o più tabelle in base alla condizione specifica nella clausola WHERE. Tuttavia, non è ansible utilizzare ORDER BY o LIMIT in un DELETE a più tabelle. La clausola table_references elenca le tabelle coinvolte nel join. La sua syntax è descritta nella Sezione 12.2.8.1, “Sintassi JOIN”.

L’esempio nel manuale è:

 DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3 WHERE t1.id=t2.id AND t2.id=t3.id; 

dovrebbe essere applicabile 1: 1.

Puoi anche utilizzare la seguente query:

DELETE FROM Student, Enrollment USING Student INNER JOIN Enrollment ON Student.studentId = Enrollment.studentId WHERE Student.studentId= 51;

Una dichiarazione di join è inutilmente complicata in questa situazione. La domanda originale riguarda solo l’eliminazione di record per un determinato utente da più tabelle contemporaneamente. Intuitivamente, potresti aspettarti che qualcosa del genere funzioni:

 DELETE FROM table1,table2,table3,table4 WHERE user_id='$user_id' 

Certo che no. Ma piuttosto che scrivere più istruzioni (ridondanti e inefficienti), utilizzando join (difficili per i principianti) o chiavi esterne (ancora più difficili per i principianti e non disponibili in tutti i motori o set di dati esistenti), puoi semplificare il codice con LOOP!

Come esempio di base con PHP (dove $ db è il tuo handle di connessione):

 $tables = array("table1","table2","table3","table4"); foreach($tables as $table) { $query = "DELETE FROM $table WHERE user_id='$user_id'"; mysqli_query($db,$query); } 

Spero che questo aiuti qualcuno!

Puoi utilizzare la seguente query per eliminare righe da più tabelle,

DELETE table1, table2, table3 FROM table1 INNER JOIN table2 INNER JOIN table3 WHERE table1.userid = table2.userid AND table2.userid = table3.userid AND table1.userid=3

da due tabelle con chiave esterna puoi provare questa query:

 DELETE T1, T2 FROM T1 INNER JOIN T2 ON T1.key = T2.key WHERE condition 

La documentazione per DELETE ti dice la syntax multi-tabella.

 DELETE [LOW_PRIORITY] [QUICK] [IGNORE] tbl_name[.*] [, tbl_name[.*]] ... FROM table_references [WHERE where_condition] 

O:

 DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name[.*] [, tbl_name[.*]] ... USING table_references [WHERE where_condition] 

Normalmente non puoi CANCELLARE da più tabelle contemporaneamente, a meno che tu non usi JOINs come mostrato in altre risposte.

Tuttavia se tutte le tue tabelle iniziano con un certo nome, allora questa query genererà una query che farebbe quel compito:

 SELECT CONCAT('DELETE FROM ', GROUP_CONCAT(TABLE_NAME SEPARATOR ' WHERE user_id=123;DELETE FROM ') , 'FROM table1;' ) AS statement FROM information_schema.TABLES WHERE TABLE_NAME LIKE 'table%' 

quindi redirect (in shell) nel comando mysql per l’esecuzione.

Ad esempio genererà qualcosa come:

 DELETE FROM table1 WHERE user_id=123; DELETE FROM table2 WHERE user_id=123; DELETE FROM table3 WHERE user_id=123; 

Un esempio più orientato alla shell sarebbe:

 echo "SHOW TABLES LIKE 'table%'" | mysql | tail -n +2 | xargs -L1 -I% echo "DELETE FROM % WHERE user_id=123;" | mysql -v 

Se vuoi usare solo MySQL per questo, puoi pensare a una query più avanzata, come questa:

 SET @TABLES = (SELECT GROUP_CONCAT(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_NAME LIKE 'table%'); PREPARE drop_statement FROM 'DELETE FROM @tables'; EXECUTE drop_statement USING @TABLES; DEALLOCATE PREPARE drop_statement; 

L’esempio sopra è basato su: MySQL – Cancella / Cancella tutte le tabelle con prefisso specifico .

di solito, mi aspetterei che questo come un ‘eliminazione a cascata’ applicato in un trigger, è necessario solo eliminare il record principale, quindi tutti i record depepndent verranno eliminati dalla logica di trigger.

questa logica sarebbe simile a ciò che hai scritto.