Esiste una query (comando) per troncare tutte le tabelle in un database in un'unica operazione? Voglio sapere se posso farlo con una sola query.
Esiste una query (comando) per troncare tutte le tabelle in un database in un'unica operazione? Voglio sapere se posso farlo con una sola query.
Risposte:
mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "drop table $table" DATABASE_NAME; done
mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "truncate table $table" DATABASE_NAME; done
mysql -e "SET FOREIGN_KEY_CHECKS = 0; drop table $table" DATABASE_NAME
mysql -Nse 'show tables' DATABASE_NAME | while read table; do echo "drop table $table;"; done | mysql DATABASE_NAME
tronca più tabelle di database sull'istanza di Mysql
SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.TABLES where table_schema in ('db1_name','db2_name');
Utilizzare il risultato della query per troncare le tabelle
Nota: potrebbe darsi che otterrai questo errore:
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
Ciò accade se esistono tabelle con riferimenti di chiavi esterne alla tabella che si sta tentando di eliminare / troncare.
Prima di troncare le tabelle Tutto ciò che devi fare è:
SET FOREIGN_KEY_CHECKS=0;
Tronca i tuoi tavoli e cambialo in
SET FOREIGN_KEY_CHECKS=1;
Usa phpMyAdmin in questo modo:
Vista database => Seleziona tutto (tabelle) => Vuoto
Se si desidera ignorare i controlli delle chiavi esterne, è possibile deselezionare la casella che dice:
[] Abilita controlli chiave esterna
Devi avere almeno la versione 4.5.0 o successiva per ottenere questa casella di controllo.
Non è MySQL CLI-fu, ma ehi, funziona!
MS SQL Server 2005+ (Rimuovi PRINT per l'esecuzione effettiva ...)
EXEC sp_MSforeachtable 'PRINT ''TRUNCATE TABLE ?'''
Se la tua piattaforma di database supporta le viste INFORMATION_SCHEMA, prendi i risultati della seguente query ed eseguili.
SELECT 'TRUNCATE TABLE ' + TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
Prova questo per MySQL:
SELECT Concat('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES
L'aggiunta di un punto e virgola al Concat semplifica l'utilizzo, ad esempio, da mysql workbench.
SELECT Concat('TRUNCATE TABLE ', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES
Ho trovato questo per eliminare tutte le tabelle in un database:
mysqldump -uUSERNAME -pPASSWORD --add-drop-table --no-data DATABASENAME | grep ^DROP | mysql -uUSERNAME -pPASSWORD DATABASENAME
Utile se sei limitato dalla soluzione di hosting (non è in grado di eliminare un intero database).
L'ho modificato per troncare le tabelle. Non esiste "--add-truncate-table" per mysqldump, quindi ho fatto:
mysqldump -uUSERNAME -pPASSWORD --add-drop-table --no-data DATABASENAME | grep ^DROP | sed -e 's/DROP TABLE IF EXISTS/TRUNCATE TABLE/g' | mysql -uUSERNAME -pPASSWORD DATABASENAME
funziona per me - modifica, correggendo un refuso nell'ultimo comando
SET FOREIGN_KEY_CHECKS = 0;
SELECT @str := CONCAT('TRUNCATE TABLE ', table_schema, '.', table_name, ';')
FROM information_schema.tables
WHERE table_type = 'BASE TABLE'
AND table_schema IN ('db1_name','db2_name');
PREPARE stmt FROM @str;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;
SELECT
questa:AND table_schema = DATABASE();
Ho trovato molto semplice fare qualcosa come il codice qui sotto, basta sostituire i nomi delle tabelle con i tuoi. importante assicurarsi che l'ultima riga sia sempre SET FOREIGN_KEY_CHECKS = 1;
SET FOREIGN_KEY_CHECKS=0;
TRUNCATE `table1`;
TRUNCATE `table2`;
TRUNCATE `table3`;
TRUNCATE `table4`;
TRUNCATE `table5`;
TRUNCATE `table6`;
TRUNCATE `table7`;
SET FOREIGN_KEY_CHECKS=1;
Questo stamperà il comando per troncare tutte le tabelle:
SELECT GROUP_CONCAT(Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME) SEPARATOR ';') FROM INFORMATION_SCHEMA.TABLES where table_schema in ('my_db');
Una volta eseguito il troncamento dei dati, creare nuovamente gli stessi vincoli di chiave esterna sulla stessa tabella. Vedi sotto uno script che genererebbe lo script per eseguire le operazioni di cui sopra.
SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' DROP FOREIGN KEY ',CONSTRAINT_NAME,';') FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_TYPE='FOREIGN KEY' AND TABLE_SCHEMA='<TABLE SCHEMA>'
UNION
SELECT CONCAT('TRUNCATE TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,';') FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA='<TABLE SCHEMA>' AND TABLE_TYPE='BASE TABLE'
UNION
SELECT CONCAT('OPTIMIZE TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,';') FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA='<TABLE SCHEMA>' AND TABLE_TYPE='BASE TABLE'
UNION
SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' ADD CONSTRAINT ',CONSTRAINT_NAME,' FOREIGN KEY(',COLUMN_NAME,')',' REFERENCES ',REFERENCED_TABLE_NAME,'(',REFERENCED_COLUMN_NAME,');') FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE CONSTRAINT_NAME LIKE 'FK%' AND TABLE_SCHEMA='<TABLE SCHEMA>'
INTO OUTFILE "C:/DB Truncate.sql" LINES TERMINATED BY '\n';
Ora, esegui lo script Db Truncate.sql generato
Benefici. 1) Recupera spazio su disco 2) Non necessario per eliminare e ricreare il DB / Schema con la stessa struttura
Inconvenienti. 1) I vincoli FK devono essere nomi nella tabella con il nome contenente "FK" nel nome del vincolo.
se si utilizza SQL Server 2005, esiste una stored procedure nascosta che consente di eseguire un comando o un set di comandi su tutte le tabelle all'interno di un database. Ecco come si chiamerebbe TRUNCATE TABLE
con questa procedura memorizzata:
EXEC [sp_MSforeachtable] @command1="TRUNCATE TABLE ?"
Ecco un buon articolo che elabora ulteriormente.
Per MySql, tuttavia, è possibile utilizzare mysqldump e specificare le opzioni --add-drop-tables
e --no-data
per eliminare e creare tutte le tabelle ignorando i dati. come questo:
mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE]
Usa questo e forma la query
SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.TABLES where table_schema in (db1,db2)
INTO OUTFILE '/path/to/file.sql';
Ora usa questo per usare questa query
mysql -u username -p </path/to/file.sql
se ricevi un errore come questo
ERROR 1701 (42000) at line 3: Cannot truncate a table referenced in a foreign key constraint
il modo più semplice per procedere è nella parte superiore del file aggiungere questa riga
SET FOREIGN_KEY_CHECKS=0;
che dice che non vogliamo controllare i vincoli di chiave esterna durante la lettura di questo file.
Troncerà tutte le tabelle nei database db1 e bd2.
No. Non esiste un singolo comando per troncare tutte le tabelle mysql contemporaneamente. Dovrai creare un piccolo script per troncare le tabelle una alla volta.
rif: http://dev.mysql.com/doc/refman/5.0/en/truncate-table.html
Ecco la mia variante per avere 'una dichiarazione per troncare' tutti '.
In primo luogo, sto usando un database separato chiamato 'util' per le mie procedure memorizzate helper. Il codice della mia procedura memorizzata per troncare tutte le tabelle è:
DROP PROCEDURE IF EXISTS trunctables;
DELIMITER ;;
CREATE PROCEDURE trunctables(theDb varchar(64))
BEGIN
declare tname varchar(64);
declare tcursor CURSOR FOR
SELECT table_name FROM information_schema.tables WHERE table_type <> 'VIEW' AND table_schema = theDb;
SET FOREIGN_KEY_CHECKS = 0;
OPEN tcursor;
l1: LOOP
FETCH tcursor INTO tname;
if tname = NULL then leave l1; end if;
set @sql = CONCAT('truncate `', theDB, '`.`', tname, '`');
PREPARE stmt from @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP l1;
CLOSE tcursor;
SET FOREIGN_KEY_CHECKS = 1;
END ;;
DELIMITER ;
Una volta che hai memorizzato questa procedura nel tuo database util, puoi chiamarla come
call util.trunctables('nameofdatabase');
che ora è esattamente una frase :-)
qui per lo so qui
SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.TABLES where table_schema in ('databasename1','databasename2');
Se non è possibile eliminare o aggiornare una riga principale: un vincolo di chiave esterna non riesce
Ciò accade se esistono tabelle con riferimenti di chiavi esterne alla tabella che si sta tentando di eliminare / troncare.
Prima di troncare le tabelle Tutto ciò che devi fare è:
SET FOREIGN_KEY_CHECKS=0;
Tronca i tuoi tavoli e cambialo in
SET FOREIGN_KEY_CHECKS=1;
utente questo codice php
$truncate = mysql_query("SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') as tables_query FROM INFORMATION_SCHEMA.TABLES where table_schema in ('databasename')");
while($truncateRow=mysql_fetch_assoc($truncate)){
mysql_query($truncateRow['tables_query']);
}
?>
controlla i dettagli qui link
Ecco una procedura che dovrebbe troncare tutte le tabelle nel database locale.
Fammi sapere se non funziona e eliminerò questa risposta.
Non testato
CREATE PROCEDURE truncate_all_tables()
BEGIN
-- Declare local variables
DECLARE done BOOLEAN DEFAULT 0;
DECLARE cmd VARCHAR(2000);
-- Declare the cursor
DECLARE cmds CURSOR
FOR
SELECT CONCAT('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES;
-- Declare continue handler
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
-- Open the cursor
OPEN cmds;
-- Loop through all rows
REPEAT
-- Get order number
FETCH cmds INTO cmd;
-- Execute the command
PREPARE stmt FROM cmd;
EXECUTE stmt;
DROP PREPARE stmt;
-- End of loop
UNTIL done END REPEAT;
-- Close the cursor
CLOSE cmds;
END;
Trovo che TRUNCATE TABLE .. abbia problemi con i vincoli di chiave esterna, anche dopo un NOCHECK VINCERE TUTTO, quindi uso invece un'istruzione DELETE FROM. Ciò significa che i seed di identità non vengono ripristinati, per ottenere ciò è sempre possibile aggiungere un DBCC CHECKIDENT.
Uso il codice seguente per stampare nella finestra di messaggio sql per troncare tutte le tabelle nel database, prima di eseguirlo. Rende solo un po 'più difficile fare un errore.
EXEC sp_MSforeachtable 'PRINT ''ALTER TABLE ? NOCHECK CONSTRAINT ALL'''
EXEC sp_MSforeachtable 'print ''DELETE FROM ?'''
EXEC sp_MSforeachtable 'print ''ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all'''
Non sono sicuro, ma penso che ci sia un comando che consente di copiare lo schema del database in un nuovo database, una volta fatto questo è possibile eliminare il vecchio database e dopo questo è possibile copiare nuovamente lo schema del database con il vecchio nome.
So che questo non è esattamente un comando, ma il risultato desiderato può essere ottenuto da phpMyAdmin seguendo questi passaggi:
L'idea è di ottenere rapidamente tutte le tabelle dal database (cosa che si fa in 5 secondi e 2 clic) ma disabilitare prima i controlli delle chiavi esterne. Nessuna CLI e nessuna eliminazione del database e aggiunta di nuovo.
TB=$( mysql -Bse "show tables from DATABASE" );
for i in ${TB};
do echo "Truncating table ${i}";
mysql -e "set foreign_key_checks=0; set unique_checks=0;truncate table DATABASE.${i}; set foreign_key_checks=1; set unique_checks=1";
sleep 1;
done
-
David,
Grazie per aver dedicato del tempo a formattare il codice, ma è così che dovrebbe essere applicato.
-Kurt
Su una scatola UNIX o Linux:
Assicurati di essere in una shell bash. Questi comandi devono essere eseguiti, dalla riga di comando come segue.
Nota:
Conservo le mie credenziali nel mio file ~ / .my.cnf, quindi non ho bisogno di fornirle sulla riga di comando.
Nota:
cpm è il nome del database
Sto solo mostrando un piccolo esempio dei risultati, da ciascun comando.
Trova i tuoi vincoli di chiave esterna:
klarsen@Chaos:~$ mysql -Bse "select concat(table_name, ' depends on ', referenced_table_name)
from information_schema.referential_constraints
where constraint_schema = 'cpm'
order by referenced_table_name"
Elenca le tabelle e i conteggi delle righe:
klarsen@Chaos:~$ mysql -Bse "SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'cpm'" | cat -n
1 address 297
2 approval_external_system 0
3 approval_request 0
4 country 189
5 credential 468
6 customer 6776
7 customer_identification 5631
8 customer_image 2
9 customer_status 13639
Tronca i tuoi tavoli:
klarsen@Chaos:~$ TB=$( mysql -Bse "show tables from cpm" ); for i in ${TB}; do echo "Truncating table ${i}"; mysql -e "set foreign_key_checks=0; set unique_checks=0;truncate table cpm.${i}; set foreign_key_checks=1; set unique_checks=1"; sleep 1; done
Verifica che abbia funzionato:
klarsen@Chaos:~$ mysql -Bse "SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'cpm'" | cat -n
1 address 0
2 approval_external_system 0
3 approval_request 0
4 country 0
5 credential 0
6 customer 0
7 customer_identification 0
8 customer_image 0
9 customer_status 0
10 email_address 0
In una finestra di Windows:
NOTA:
cpm è il nome del database
C:\>for /F "tokens=*" %a IN ('mysql -Bse "show tables" cpm') do mysql -e "set foreign_key_checks=0; set unique_checks=0; truncate table %a; foreign_key_checks=1; set unique_checks=1" cpm
La seguente query MySQL produrrà essa stessa una singola query che troncerà tutte le tabelle in un determinato database. Ignora i tasti ESTERI:
SELECT CONCAT(
'SET FOREIGN_KEY_CHECKS=0; ',
GROUP_CONCAT(dropTableSql SEPARATOR '; '), '; ',
'SET FOREIGN_KEY_CHECKS=1;'
) as dropAllTablesSql
FROM ( SELECT Concat('TRUNCATE TABLE ', table_schema, '.', TABLE_NAME) AS dropTableSql
FROM INFORMATION_SCHEMA.TABLES
WHERE table_schema = 'DATABASE_NAME' ) as queries
Soln 1)
mysql> select group_concat('truncate',' ',table_name,';') from information_schema.tables where table_schema="db_name" into outfile '/tmp/a.txt';
mysql> /tmp/a.txt;
Soln 2)
- Export only structure of a db
- drop the database
- import the .sql of structure
-- modificare ----
earlier in solution 1, i had mentioned concat() instead of group_concat() which would have not returned the desired result
Un'idea potrebbe essere quella di eliminare e ricreare le tabelle?
MODIFICARE:
@Jonathan Leffler: True
Altro suggerimento (o caso non è necessario troncare TUTTE le tabelle):
Perché non creare semplicemente una stored procedure di base per troncare tabelle specifiche
CREATE PROCEDURE [dbo].[proc_TruncateTables]
AS
TRUNCATE TABLE Table1
TRUNCATE TABLE Table2
TRUNCATE TABLE Table3
GO
<?php
// connect to database
$conn=mysqli_connect("localhost","user","password","database");
// check connection
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}
// sql query
$sql =mysqli_query($conn,"TRUNCATE " . TABLE_NAME);
// Print message
if ($sql === TRUE) {
echo 'data delete successfully';
}
else {
echo 'Error: '. $conn->error;
}
$conn->close();
?>
Ecco lo snippet di codice che utilizzo per cancellare una tabella. Basta cambiare $ conn info e TABLE_NAME.