Alle Tabellen in einer MySQL-Datenbank mit einem Befehl abschneiden?

346

Gibt es eine Abfrage (Befehl), um alle Tabellen in einer Datenbank in einem Vorgang abzuschneiden? Ich möchte wissen, ob ich dies mit einer einzigen Abfrage tun kann.

devang
quelle
1
Alle Tabellen abschneiden? Meinten Sie damit, alle Spalten aller Tabellen in einer Datenbank abzuschneiden? In welcher Abfragesprache ist das? (zB SQL, MySQL, Oracle, Postgres usw.)
Jay
Ich bin mir nicht sicher, ob ich dies empfehlen würde, da Sie sehr leicht in Schwierigkeiten geraten könnten. Gibt es einen Grund, warum Sie nicht einfach die Kürzungen skripten und das Skript ausführen können?
GrayWizardx
danke 4 die Antwort, aber nur der Grund, warum es kein Skript gibt, läuft die Zeit davon, also dachte ich daran, eine Abfrage in mysql
devang
ya es ist in mysql..und Abfrage bedeutet etwas ähnlich wie Tabelle Tabelle_Name abschneiden..hier möchte ich alle Zeilen aller Tabellen in meiner
Datenbank
Sie können Information_Schema mit einem Cursor verwenden. Ich bin mir nicht sicher über MySql, aber es sollte Information_Schema.Tables
GrayWizardx unterstützen.

Antworten:

340

Löschen (dh Tabellen entfernen)

mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "drop table $table" DATABASE_NAME; done

Abschneiden (dh leere Tabellen)

mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "truncate table $table" DATABASE_NAME; done
Battousaix
quelle
17
Ja, sauber, ty. Möglicherweise müssen Sie dies jedoch mit -uUSER -pPASSWORD ausführen. Außerdem müssen Sie es möglicherweise mehrmals ausführen, wenn Sie FK ohne Löschen in der Kaskade haben.
Mihaicc
47
Wenn Sie auf FK-Probleme wie " Eine übergeordnete Zeile kann nicht gelöscht oder aktualisiert werden: Eine Fremdschlüsseleinschränkung schlägt fehl " stoßen, müssen Sie die Fremdschlüsselprüfung deaktivieren, indem Sie den Befehl wie folgt ändern:mysql -e "SET FOREIGN_KEY_CHECKS = 0; drop table $table" DATABASE_NAME
Ethan P.
24
Es ist jedoch nicht erforderlich, den MySQL-Client zu schleifen. Nehmen Sie es wie mysql -Nse 'show tables' DATABASE_NAME | while read table; do echo "drop table $table;"; done | mysql DATABASE_NAME
folgt
2
@ TylerCollier Sie brauchen eine .my.cnf
Felix Eve
2
Basierend auf der obigen Antwort und den Kommentaren und weil sie für mich nicht wie erwartet funktionierten, habe ich ein einfaches Bash-Skript erstellt, das Sie dafür verwenden können. Sie finden es unter: gist.github.com/mocanuga/eff26a3dcc40ef657a1c812f68511f6d
mocanuga
145

Schneiden Sie mehrere Datenbanktabellen auf der MySQL-Instanz ab

SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') 
FROM INFORMATION_SCHEMA.TABLES where  table_schema in ('db1_name','db2_name');

Verwenden Sie das Abfrageergebnis, um Tabellen abzuschneiden

Hinweis: Möglicherweise wird folgende Fehlermeldung angezeigt:

ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

Dies ist der Fall, wenn Tabellen mit Fremdschlüsselverweisen auf die Tabelle vorhanden sind, die Sie löschen / abschneiden möchten.

Vor dem Abschneiden von Tabellen Alles, was Sie tun müssen, ist:

SET FOREIGN_KEY_CHECKS=0;

Schneiden Sie Ihre Tabellen ab und ändern Sie sie wieder in

SET FOREIGN_KEY_CHECKS=1;
lalit choudhary
quelle
1
Dies ist wahrscheinlich die beste Lösung, wenn Sie einen Benutzer und ein Kennwort für Ihre Datenbank haben und diese nicht sichtbar in Ihre Shell eingeben möchten.
Bach
5
Upvoted, da diese Lösung nur DB-Zugriff und keinen SSH-Zugriff erfordert. Darüber hinaus ist es OS-unabhängig.
Mastazi
@mastazi Ich habe ein paar Fragen: 1. Wofür steht "table_schema"? Steht es vom Schemanamen? 2.Wofür steht TABLE_NAME? Steht es für die Tabellen, die gelöscht werden sollen? 3. Soll ich die Tabellen, die gelöscht werden sollen, mit dem Befehl "('db1_name', 'db2_name')" hoch schreiben?
AAEM
@Ahmed Die einzigen erforderlichen Ersetzungen sind, dass Sie db1_name und db2_name durch die Namen Ihrer Datenbanken ersetzen müssen. Anschließend müssen Sie die Ergebnisse dieser Abfrage kopieren, als neue MySQL-Abfrage einfügen und ausführen. INFORMATION_SCHEMA ist ein integriertes Schema, das in jeder MySQL-Installation vorinstalliert ist und Informationen zu Ihren Datenbanken enthält. Berühren Sie es nicht, da sich MySQL sonst schlecht verhält :-) Tabellenschema und Tabellenname sind Spalten der Tabelle mit dem Namen "TABLES" information_schema
mastazi
Mit "Datenbankname" meinen Sie den Namen des Schemas? Ich habe nur 1 Schema, dass ich seine Tabellendaten löschen möchte
AAEM
66

Verwenden Sie phpMyAdmin folgendermaßen:

Datenbankansicht => Alle prüfen (Tabellen) => Leer

Wenn Sie Fremdschlüsselprüfungen ignorieren möchten, können Sie das Kontrollkästchen deaktivieren:

[] Fremdschlüsselprüfungen aktivieren

Sie müssen mindestens Version 4.5.0 oder höher ausführen, um dieses Kontrollkästchen zu erhalten.

Es ist nicht MySQL CLI-fu, aber hey, es funktioniert!

Nemo
quelle
31
Wer hat gesagt, dass wir PHP verwenden ...?
Jsh
37
Wer hat gesagt, dass wir es nicht getan haben? Diese Antwort erweist sich anscheinend als nützlich für die Menschen; es hilft.
Bzeaman
2
Dies funktioniert nicht, wenn Sie ein Eltern-Kind-Datenbankschema haben.
Cary Bondoc
2
Fremdschlüsseleinschränkung schlägt fehl.
Brian Hannay
2
@BrianHannay Es wurde in PMA 4.5.0 im Juni 2015 hinzugefügt. Ich fand das Changelog und die ursprüngliche Ausgabe
Nemo
24

MS SQL Server 2005+ (PRINT für die tatsächliche Ausführung entfernen ...)

EXEC sp_MSforeachtable 'PRINT ''TRUNCATE TABLE ?'''

Wenn Ihre Datenbankplattform INFORMATION_SCHEMA-Ansichten unterstützt, nehmen Sie die Ergebnisse der folgenden Abfrage und führen Sie sie aus.

SELECT 'TRUNCATE TABLE ' + TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

Versuchen Sie dies für MySQL:

SELECT Concat('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES

Das Hinzufügen eines Semikolons zum Concat erleichtert die Verwendung, z. B. innerhalb der MySQL-Workbench.

SELECT Concat('TRUNCATE TABLE ', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES
Strand
quelle
hi..thanks für d antworten ich diese Abfrage versucht , aber scheint nicht zu work..is der so etwas wie truncate table table_name , die ich für alle Tabellen in meiner db verwenden können ..
Devang
Ich habe vergessen, dass MySQL den Operator "+" nicht direkt unterstützt. Angenommen, dies ist der Fehler, habe ich das obige CONCAT () - Beispiel hinzugefügt. Wenn Sie immer noch eine Fehlermeldung erhalten, teilen Sie uns bitte die tatsächliche Fehlermeldung mit.
Strand
Diese Abfrage funktioniert, aber was ist, wenn ich einen anderen Datenbanknamen habe, z. B. devang? Ist mein Datenbankname? Wenn ich ihn gemäß Ihrer obigen Abfrage verwende, wird der folgende Fehler ausgegeben. Tabelle 'devang.TABLES' existiert nicht
devang
3
Ahh. INFORMATION_SCHEMA ist eine Ansicht, die in der aktiven Datenbank vorhanden ist. Wenn Sie Ihre Datenbank ändern, wird die Ansicht für diese Datenbank ausgeführt. Es ist nicht erforderlich, die Abfrage beim Ändern von Datenbanken zu ändern. Befolgen Sie einfach diese Schritte: 1) Ändern Sie die aktive Datenbank. 2) Führen Sie das Skript aus. 3) Kopieren Sie die Ergebnisse. 4) Fügen Sie die Ergebnisse wieder in den Editor ein. 5) Führen Sie die Ergebnisse aus. Alle Tabellen in der aktiven Datenbank werden jetzt abgeschnitten.
Strand
1
IN ACHT NEHMEN! Dadurch werden alle Tabellen in allen Datenbanken ausgewählt (auch diejenigen, die NICHT in der aktuellen Datenbank enthalten sind. Das MySQL-Beispiel funktioniert nicht, aber in meinem Fall wurden 293 Zeilen (Tabellen) anstelle von 66 zurückgegeben. Stellen Sie sich den Datenverlust vor ...
f4der
19

Ich fand dies, um alle Tabellen in einer Datenbank zu löschen:

mysqldump -uUSERNAME -pPASSWORD --add-drop-table --no-data DATABASENAME | grep ^DROP | mysql -uUSERNAME -pPASSWORD DATABASENAME

Nützlich, wenn Sie durch die Hosting-Lösung eingeschränkt sind (nicht in der Lage, eine ganze Datenbank zu löschen).

Ich habe es geändert, um die Tabellen abzuschneiden. Es gibt keine "--add-truncate-table" für mysqldump, also habe ich:

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

funktioniert bei mir --edit, behebt einen Tippfehler im letzten Befehl

mbjungle
quelle
15
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;
George Moik
quelle
Wenn Sie mit der aktuellen Datenbank arbeiten möchten (und diesen Code somit portabel machen möchten), ändern Sie die letzte Bedingung in folgende SELECT:AND table_schema = DATABASE();
Alx
Es schneidet für mich nicht ab. MySQL 5.7.25
Lucas Bustamante
14

Ich fand es am einfachsten, einfach so etwas wie den folgenden Code zu tun. Ersetzen Sie einfach die Tabellennamen durch Ihre eigenen. wichtig stellen Sie sicher, dass die letzte Zeile immer SET FOREIGN_KEY_CHECKS = 1 ist;

SET FOREIGN_KEY_CHECKS=0;
TRUNCATE `table1`;
TRUNCATE `table2`;
TRUNCATE `table3`;
TRUNCATE `table4`;
TRUNCATE `table5`;
TRUNCATE `table6`;
TRUNCATE `table7`;
SET FOREIGN_KEY_CHECKS=1;
user3357946
quelle
7
Sie müssen SET FOREIGN_KEY_CHECKS = 0 nicht wiederholen. nach jedem TRUNCATE-Befehl direkt an der Startzeile, der den Modus als 0
markiert
12

Dadurch wird der Befehl zum Abschneiden aller Tabellen gedruckt:

SELECT GROUP_CONCAT(Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME) SEPARATOR ';') FROM INFORMATION_SCHEMA.TABLES where table_schema in ('my_db');
Gaurav Gupta
quelle
5
  1. Um eine Tabelle abzuschneiden, müssen die den Spalten in dieser Tabelle zugeordneten Fremdschlüsseleinschränkungen aus anderen Tabellen entfernt werden (tatsächlich für alle Tabellen in der spezifischen Datenbank / im spezifischen Schema).
  2. Daher müssen zunächst alle Fremdschlüsseleinschränkungen gelöscht und anschließend die Tabelle abgeschnitten werden.
  3. Verwenden Sie optional die Optimierungstabelle (in MySQL, Innodb Engine Esp), um den verwendeten Datenraum / die Größe nach dem Abschneiden der Daten an das Betriebssystem zurückzugewinnen.
  4. Erstellen Sie nach dem Abschneiden der Daten erneut dieselben Fremdschlüsseleinschränkungen für dieselbe Tabelle. Unten sehen Sie ein Skript, das das Skript zur Ausführung der oben genannten Vorgänge generiert.

    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';

Führen Sie nun das generierte Skript Db Truncate.sql aus

Leistungen. 1) Speicherplatz zurückfordern 2) Nicht erforderlich, um die Datenbank / das Schema mit derselben Struktur zu löschen und neu zu erstellen

Nachteile. 1) FK-Einschränkungen sollten Namen in der Tabelle sein, wobei der Name 'FK' im Einschränkungsnamen enthält.

Anand
quelle
3

Wenn Sie SQL Server 2005 verwenden, gibt es eine versteckte gespeicherte Prozedur, mit der Sie einen Befehl oder eine Reihe von Befehlen für alle Tabellen in einer Datenbank ausführen können. So würden Sie TRUNCATE TABLEmit dieser gespeicherten Prozedur aufrufen :

EXEC [sp_MSforeachtable] @command1="TRUNCATE TABLE ?"

Hier ist ein guter Artikel, der weiter ausgeführt wird.

Für MySql, aber Sie könnten mysqldump und geben Sie die Verwendung --add-drop-tablesund --no-dataOptionen Drop und erstellen Sie alle Tabellen , um die Daten zu ignorieren. so was:

mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE]

mysqldump-Verwendungshandbuch von dev.mysql

Dostee
quelle
3

Verwenden Sie dies und bilden Sie die Abfrage

SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') 
FROM INFORMATION_SCHEMA.TABLES where  table_schema in (db1,db2)
INTO OUTFILE '/path/to/file.sql';

Verwenden Sie dies nun, um diese Abfrage zu verwenden

mysql -u username -p </path/to/file.sql

wenn Sie eine solche Fehlermeldung erhalten

ERROR 1701 (42000) at line 3: Cannot truncate a table referenced in a foreign key constraint

Der einfachste Weg ist, diese Zeile oben in Ihrer Datei hinzuzufügen

SET FOREIGN_KEY_CHECKS=0;

Dies besagt, dass wir die Fremdschlüsseleinschränkungen beim Durchgehen dieser Datei nicht überprüfen möchten.

Alle Tabellen in den Datenbanken db1 und bd2 werden abgeschnitten.

Vinod Kumar
quelle
Die Datenbanknamen sollten in Qoutes sein
Roman M
2

Hier ist meine Variante, 'eine Anweisung zu haben, um' sie alle 'abzuschneiden.

Erstens verwende ich eine separate Datenbank mit dem Namen 'util' für meine gespeicherten Hilfsprozeduren. Der Code meiner gespeicherten Prozedur zum Abschneiden aller Tabellen lautet:

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 ;

Sobald Sie diese gespeicherte Prozedur in Ihrer util-Datenbank haben, können Sie sie wie folgt aufrufen

call util.trunctables('nameofdatabase');

das ist jetzt genau eine aussage :-)

bebbo
quelle
2

hier, denn ich weiß hier

   SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') 
    FROM INFORMATION_SCHEMA.TABLES where  table_schema in ('databasename1','databasename2');

Wenn eine übergeordnete Zeile nicht gelöscht oder aktualisiert werden kann: Eine Fremdschlüsseleinschränkung schlägt fehl

Dies ist der Fall, wenn Tabellen mit Fremdschlüsselverweisen auf die Tabelle vorhanden sind, die Sie löschen / abschneiden möchten.

Vor dem Abschneiden von Tabellen Alles, was Sie tun müssen, ist:

SET FOREIGN_KEY_CHECKS=0;

Schneiden Sie Ihre Tabellen ab und ändern Sie sie wieder in

SET FOREIGN_KEY_CHECKS=1; 

Benutzer diesen PHP-Code

    $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']);

    }
?>

Detail hier überprüfen Link

Jydipsinh Parmar
quelle
1

Hier ist eine Prozedur, die alle Tabellen in der lokalen Datenbank abschneiden sollte.

Lassen Sie mich wissen, wenn es nicht funktioniert und ich werde diese Antwort löschen.

Ungetestet

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;
Strand
quelle
Ich habe viel Zeit gebraucht, um herauszufinden, warum dies nicht funktioniert hat. Dann hat ein Kommentar zu diesem E-Mail-Thread geholfen: forums.mysql.com/read.php?61,116597,219343#msg-219343 - Als Referenz : "Leider sieht es so aus, als könnten
Prep-
1

Ich finde, dass TRUNCATE TABLE .. Probleme mit Fremdschlüsseleinschränkungen hat, selbst nach einer NOCHECK CONSTRAINT ALL, daher verwende ich stattdessen eine DELETE FROM-Anweisung. Dies bedeutet, dass Identitäts-Seeds nicht zurückgesetzt werden. Sie können jederzeit einen DBCC-CHECKIDENT hinzufügen, um dies zu erreichen.

I Verwenden Sie den folgenden Code, um die SQL zum Abschneiden aller Tabellen in der Datenbank im Nachrichtenfenster auszudrucken, bevor Sie sie ausführen. Es macht es nur ein bisschen schwieriger, einen Fehler zu machen.

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'''
cedd
quelle
0

Ich bin nicht sicher, aber ich denke, es gibt einen Befehl, mit dem Sie das Datenbankschema in eine neue Datenbank kopieren können. Sobald Sie dies getan haben, können Sie die alte Datenbank löschen und danach das Datenbankschema erneut in den alten Namen kopieren.

GJ.
quelle
1
mysqldump -uuser -ppassword --no-data salesLeadsBrittany> salesLeadsTemplate.sql Dadurch wird eine SQL-Datei nur mit dem Schema erstellt (keine Daten). Nach diesem Befehl können Sie die Datenbank löschen und die Datenbank durch Importieren des Schemas neu erstellen.
GJ.
0

Ich weiß, dass dies nicht genau ein Befehl ist, aber das gewünschte Ergebnis kann in phpMyAdmin erzielt werden, indem die folgenden Schritte ausgeführt werden:

  1. Wählen Sie (alle) zu entfernenden Tabellen aus (Alle prüfen)
  2. Wählen Sie "Drop" / "Truncate" aus der Liste "With selected:"
  3. Kopieren Sie auf der Bestätigungsseite ("Wollen Sie wirklich:") die Abfrage (alles mit rotem Hintergrund)
  4. Gehen Sie nach oben und klicken Sie auf SQL und schreiben Sie: "SET FOREIGN_KEY_CHECKS = 0;" Fügen Sie dann die zuvor kopierte Abfrage ein
  5. Klicken Sie auf "Los"

Die Idee ist, schnell alle Tabellen aus der Datenbank abzurufen (was Sie in 5 Sekunden und 2 Klicks tun), aber zuerst die Fremdschlüsselprüfung zu deaktivieren. Keine CLI und kein Löschen der Datenbank und erneutes Hinzufügen.

Pavel Mocan
quelle
0
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,

Vielen Dank, dass Sie sich die Zeit genommen haben, den Code zu formatieren, aber so soll er angewendet werden.

-Kurt

Auf einer UNIX- oder Linux-Box:

Stellen Sie sicher, dass Sie sich in einer Bash-Shell befinden. Diese Befehle müssen wie folgt über die Befehlszeile ausgeführt werden.

Hinweis:

Ich speichere meine Anmeldeinformationen in meiner Datei ~ / .my.cnf, sodass ich sie nicht in der Befehlszeile angeben muss.

Hinweis:

cpm ist der Datenbankname

Ich zeige nur eine kleine Auswahl der Ergebnisse von jedem Befehl.

Finden Sie Ihre Fremdschlüsseleinschränkungen:

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"
  1. genehmigungsexternes_system hängt von genehmigungsanforderung ab
  2. Adresse hängt vom Kunden ab
  3. Kundenidentifikation hängt vom Kunden ab
  4. external_id hängt vom Kunden ab
  5. Der Berechtigungsnachweis hängt vom Kunden ab
  6. email_address hängt vom Kunden ab
  7. Approval_Request hängt vom Kunden ab
  8. customer_status hängt vom Kunden ab
  9. customer_image hängt vom Kunden ab

Listen Sie die Tabellen und Zeilenzahlen auf:

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

Schneiden Sie Ihre Tabellen ab:

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
  1. Tabellenadresse abschneiden
  2. Tabelle Approval_external_system abschneiden
  3. Abschneiden der Tabelle genehmigungsanforderung
  4. Tabellenland abschneiden
  5. Tabellenanmeldeinformationen abschneiden
  6. Kunden abschneiden
  7. Abschneiden der Tabelle customer_identification
  8. Tabelle customer_image abschneiden
  9. Abschneiden der Tabelle customer_status

Stellen Sie sicher, dass es funktioniert hat:

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

Auf einer Windows-Box:

HINWEIS:

cpm ist der Datenbankname

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
Kurt Larsen
quelle
0

Die folgende MySQL-Abfrage erzeugt selbst eine einzelne Abfrage, die alle Tabellen in einer bestimmten Datenbank abschneidet. Es umgeht AUSLÄNDISCHE Schlüssel:

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
Roel van Duijnhoven
quelle
0
mysqldump -u root -p --no-data dbname > schema.sql
mysqldump -u root -p drop dbname
mysqldump -u root -p < schema.sql
emanuele
quelle
0

Lösung 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;

Lösung 2)

- Export only structure of a db
- drop the database
- import the .sql of structure 

- bearbeiten ----

earlier in solution 1, i had mentioned concat() instead of group_concat() which would have not returned the desired result
Angelin Nadar
quelle
1
Dies scheint nur die erste Tabelle zurückzugeben: TRUNCATE table1 und vergisst alle anderen Tabellen.
Stephen Smith
Diese Lösung wäre definitiv verrückt. Ich weiß nicht, warum es keine Abstimmung bekam. kann an meinem Fehler liegen, der bearbeitet wurde.
Angelin Nadar
0

Das hat bei mir funktioniert. Ändern Sie Datenbank, Benutzername und Passwort entsprechend.

mysql -Nse 'show tables' -D DATABASE -uUSER -pPWD | while read table; do echo "SET FOREIGN_KEY_CHECKS = 0;drop table \`$table\`;SET FOREIGN_KEY_CHECKS = 1;"; done | mysql DATABASE -uUSER -pPWD

Akif
quelle
-1

Eine Idee könnte sein, die Tabellen einfach zu löschen und neu zu erstellen?

BEARBEITEN:

@ Jonathan Leffler: Stimmt

Anderer Vorschlag (oder Fall, dass Sie nicht ALLE Tabellen abschneiden müssen):

Warum nicht einfach eine gespeicherte Basisprozedur erstellen, um bestimmte Tabellen abzuschneiden?

CREATE PROCEDURE [dbo].[proc_TruncateTables]
AS
TRUNCATE TABLE Table1
TRUNCATE TABLE Table2
TRUNCATE TABLE Table3
GO
Mark Redman
quelle
Dadurch gehen alle Einschränkungen, Berechtigungen, Ansichten usw. in den Tabellen verloren - was ein erhebliches Ärgernis darstellt.
Jonathan Leffler
Sie können einen Löschvorgang durchführen und dann alle Tabellen neu festlegen, anstatt sie abzuschneiden. Ich gehe davon aus, dass die Markierung aus Frustration erfolgt. Stellen Sie einfach Ihr Backup wieder her.
Mark Redman
-5
<?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();

?>

Hier ist ein Code-Snippet, mit dem ich eine Tabelle lösche. Ändern Sie einfach $ conn info und TABLE_NAME.

James Leveille
quelle
Hey James, ich denke, das OP sucht erstens nach einem Einzeiler ... und zweitens nach einem Befehl, um alle Tabellen einmal auszuschalten und zu löschen. Dies erfordert eine Art Benutzereingriff. Vielen Dank für den Beitrag
Craig Wayne