2009-12-11 11 views
31

Ho 100 tabelle, 40.000 righe in ogni tabella. Voglio andare in MySQL e cancellare tutte le righe da tutte le tabelle.Elimina dati da tutte le tabelle in MYSQL

... in 1 istruzione, se possibile?

Voglio mantenere il database e le tabelle.

risposta

10

Io non la penso così (ma ho sbagliato prima). Quello che tendo a fare è che questi casi è un processo in due fasi.

Se il DBMS ha un'interfaccia a riga di comando, è possibile utilizzarlo per creare uno script per fare il grosso del lavoro, qualcosa come:

db2 "select 'db2 delete from ' | tblname from sysibm.systables 
    where owner = 'pax'" >p2.sh 
p2.sh 

Il primo bit crea semplicemente un file p2.sh (o un p2.cmd in Windows) contenente una dichiarazione delete from per ogni tabella di proprietà di pax. Quindi esegui quel file di comando per eseguire il lavoro sporco. Si consiglia di controllare prima, naturalmente :-)

Non il processo in un'unica fase che stavi cercando, ma ancora molto semplice. Presumo qui che mysql abbia anche un'interfaccia a riga di comando.

Aggiornamento:

La versione di MySQL dei look di cui sopra come dovrebbe essere:

echo "select 'mysql truncate table ' | table_name 
       from information_schema.tables" | mysql >p2.sh 
bash p2.sh 

Questo utilizza il comando truncate che di solito è più efficiente di delete from per l'eliminazione di tutte le righe. Utilizza inoltre le tabelle di sistema MySQL corrette per ottenere i nomi delle tabelle.

Un solo punto: è possibile che si desideri inserire una clausola where in quella selezione per limitare le tabelle a quelle che si desidera eliminare. La query così com'è tenterà di eliminare ogni tabella. Una possibilità è limitarla con specifici valori table_schema e/o table_type.

+0

ovviamente non è la soluzione definitiva ma phpMyAdmin consente di farlo in meno di 5 secondi ... Puoi selezionare tutte le tabelle e applicare solo un troncato per tutte. –

1

E 'possibile, ma ha effetti collaterali che potrebbe non piacere:

drop database <dbname>; 

Significa strutture delle tabelle vengono eliminate, così come gli indici, stored procedure, ecc, ecc

L'unico altro modo sarebbe quello di scrivere una stored procedure, che in qualche modo con loop

truncate table <tablename>; 
+1

voglio mantenere il database e le tabelle. – TIMEX

-3

solo una supposizione ... provare per credere

0.123.

TABELLA DEI TRONCATI *;

O

TRUNCATE TABLE tabella1, tabella2, table3;

O

DELETE FROM tabella1, tabella2, table3 dove 1 = 1;

+0

Non l'ho mai visto pubblicizzato o implementato ovunque. Funziona? – wallyk

+0

Non ne ho idea, ma sarebbe bello se lo facesse! –

+1

"WHERE 1 = 1" è eccessivo e quindi non necessario. – mctom987

6

Ciò richiederà una stored procedure o script che scorre ogni tavolo e fa:

truncate table <tablename>

Per ottenere l'elenco delle tabelle per troncare si può fare qualcosa di simile:

SELECT table_name 
FROM INFORMATION_SCHEMA.tables 
WHERE table_schema = 'db_name' 
+0

+1: stareste usando una dichiarazione preparata per poter iterare attraverso le tabelle: http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html –

27

Il metodo più semplice per troncare tutte le tabelle mantenendo lo schema.

mysqldump -d -uuser -ppass --add-drop-table databasename > databasename.sql 

mysql -uuser -ppass databasename < databasename.sql 

Non sono sicuro se manterrà le stored procedure in quanto non sono in uso dove lavoro, ma io uso regolarmente per ripristinare i database.

L'opzione -d su mysqldump significa "non eseguire il dump dei dati".

Il --add-drop-table antepone un'istruzione DROP TABLE a ogni CREATE TABLE nel dump.

+14

questo funziona ma attenzione!!!! elimina tutti i vincoli di chiave esterna. – mickeymoon

4

Esportare lo script SQL, eliminare il database, ricreare il database rispetto allo script. :)

4
$ mysqldump --no-data -u [username] -p[password] [database] > [location] 
$ mysql -u [username] -p[password] 
mysql > drop database [database]; create database [database]; 
mysql > exit; 
$ mysql -u [username] -p[password] [database] < [location] 

L'interruttore --no-data conserva solo le informazioni di tabella di database, e ignorerà tutti i dati della tabella; devi semplicemente reimportare il file .sql generato per recuperare tutte le informazioni della tabella.

-1

Questo Script due linea è il miglior ... provatelo

EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL' 
GO 
EXEC sp_MSForEachTable 'DELETE FROM ?' 
GO 
+0

Questo non funzionerà con MySQL. – Lunc

1
DELIMITER $$ 

DROP PROCEDURE IF EXISTS `cleanAllTables`$$ 

CREATE DEFINER=`root`@`%` PROCEDURE `cleanAllTables`() 

BEGIN 

DROP Temporary TABLE IF EXISTS AllTables; 

Create Temporary Table AllTables (

SELECT @curRow := @curRow + 1 AS row_number 
, table_name 
FROM INFORMATION_SCHEMA.tables s 
JOIN (SELECT @curRow := 0 
) r 
WHERE s.table_schema = 'databasename'); 

set @countOfAllTables = (select count(*) from AllTables); 
set @c = 1; 
WHILE @c<[email protected] DO 

    set @table_name = (select table_name from AllTables where row_number = @c); 
    set @stmt = concat('Truncate Table ', @table_name); 
    Prepare stmt from @stmt; 
    Execute stmt; 
    SET @c = @c + 1 ; 
END WHILE ; 

END$$ 

DELIMITER ; 
+0

e ovviamente dopo aver creato tale procedura, si scriverà call cleanAllTables; – Machoo

1

Questo funziona per me in MySQL 5, ed è specifico per le tabelle:

echo 'show tables' | mysql --skip-column-names -u root YOUR_DB | awk '{print "truncate table " $0 ";"}' | mysql -u root YOUR_DB

Sostituisci YOUR_DB con il nome del tuo database. Devi fornire la tua password due volte, quindi hai la possibilità di pensarci di nuovo ... ;-)

0

Perché non puoi semplicemente esportare la struttura del database, eliminare il database, quindi ricrearlo e importare la struttura?

4

Il modo più robusto per cancellare tutte le tabelle di un database è stato presentato da kostanos in How to remove all MySQL tables from the command-line without DROP database permissions?

Dal momento che il codice qui sotto cancella tutte le tabelle del database corrente si potrebbe desiderare di selezionare un database diverso prima di procedere.

USE DATABASE_YOU_WANT_TO_CLEAR; 

Lo snippet seguente rimuove i dati dalle tabelle anche in presenza di vincoli di chiave esterna. Si potrebbe anche voler ricontrollare l'elenco delle tabelle prima della pulizia effettiva, nel caso in cui si fosse dimenticato di selezionare il database corretto.

-- save current foreign key settings and disable foreign key checks 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET GROUP_CONCAT_MAX_LEN=32768; -- you never know how people name their tables 
SET @tables = NULL; 
SELECT GROUP_CONCAT('`', table_name, '`') INTO @tables 
    FROM information_schema.tables 
    WHERE table_schema = (SELECT DATABASE()); -- operates on the current DB 
SELECT IFNULL(@tables,'dummy') INTO @tables; -- avoid error if there are no tables 

-- At this point you might want to double check the list of tables 
-- to be cleared. Run SELECT @tables; to do so. 

SET @tables = CONCAT('DROP TABLE IF EXISTS ', @tables); 
PREPARE stmt FROM @tables; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
SET [email protected]_FOREIGN_KEY_CHECKS; 
+0

Questa è una bella risposta. Dovrebbe essere accettato. –

+0

Sebbene il comando TRUNCATE funzioni solo per una tabella alla volta. Ref. http://stackoverflow.com/questions/15926826/truncate-multi-tables –

1

Ho dovuto ripristinare un backup che mancava le dichiarazioni di creazione. Così ho ripristinato un backup più vecchio ma ho dovuto sbarazzarmi dei dati. Questo oneliner mi ha aiutato a troncare tutto.

mysql -u user -ppass -NBe "SELECT 'SET foreign_key_checks = 0;' UNION SELECT CONCAT('TRUNCATE TABLE myschema.', table_name, ';') FROM INFORMATION_SCHEMA.tables WHERE table_schema = 'myschema' AND table_type = 'BASE TABLE'" | mysql -u user -ppass 

Per una migliore leggibilità di nuovo con interruzioni di riga:

mysql -u user -ppass -NBe "SELECT 'SET foreign_key_checks = 0;' 
    UNION SELECT CONCAT('TRUNCATE TABLE myschema.', table_name, ';') 
    FROM INFORMATION_SCHEMA.tables 
    WHERE table_schema = 'myschema' AND table_type = 'BASE TABLE'" 
     | mysql -u user -ppass 

essere sicuri di utilizzare la stringa senza interruzioni di riga e sostituire myschema con il vostro schema della tabella e impostare le credenziali di accesso corrette o ospitano per il processo di mysql.

+0

Salverò qualche congettura, è necessario sostituire ciascuna delle credenziali 'utente',' password' e nome db 'myschema' due volte. – aitchnyu

-1

Utilizzare MySQL Workbench per ottenere il diagramma delle relazioni di entità del database (in Workbench: Database -> Reverse Engineer). Quindi rilascia il database. Quindi creare un database usando Workbench (Database -> Forward Engineer).

0

In linea di comando ...

USE dbname 

SET foreign_key_checks = 0; 
TRUNCATE tablename; //do this for each table you want emptied 
SET foreign_key_checks = 1; 
Problemi correlati