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.


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

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;

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!


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

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


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;

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;

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

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.


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


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.


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 :-)


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


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;

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

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.


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.


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

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

0
mysqldump -u root -p --no-data dbname > schema.sql
mysqldump -u root -p drop dbname
mysqldump -u root -p < schema.sql

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

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


-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

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.