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.
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 |whilereadtable; do mysql -e "drop table $table" DATABASE_NAME; done
Abschneiden (dh leere Tabellen)
mysql -Nse 'show tables' DATABASE_NAME |whilereadtable; do mysql -e "truncate table $table" DATABASE_NAME; done
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
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 deleteorupdate a parent row: a foreignkeyconstraint 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
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!
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:
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;
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).
Daher müssen zunächst alle Fremdschlüsseleinschränkungen gelöscht und anschließend die Tabelle abgeschnitten werden.
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.
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.
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 :
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:
Nein. Es gibt keinen einzigen Befehl, um alle MySQL-Tabellen gleichzeitig abzuschneiden. Sie müssen ein kleines Skript erstellen, um die Tabellen einzeln abzuschneiden.
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:
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']);}?>
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
CREATEPROCEDURE truncate_all_tables()BEGIN-- Declare local variablesDECLARE done BOOLEAN DEFAULT0;DECLARE cmd VARCHAR(2000);-- Declare the cursorDECLARE cmds CURSORFORSELECT CONCAT('TRUNCATE TABLE ', TABLE_NAME)FROM INFORMATION_SCHEMA.TABLES;-- Declare continue handlerDECLARECONTINUE HANDLER FOR SQLSTATE '02000'SET done=1;-- Open the cursorOPEN cmds;-- Loop through all rows
REPEAT
-- Get order numberFETCH cmds INTO cmd;-- Execute the command
PREPARE stmt FROM cmd;EXECUTE stmt;DROP PREPARE stmt;-- End of loop
UNTIL done END REPEAT;-- Close the cursorCLOSE cmds;END;
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.
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.
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:
Wählen Sie (alle) zu entfernenden Tabellen aus (Alle prüfen)
Wählen Sie "Drop" / "Truncate" aus der Liste "With selected:"
Kopieren Sie auf der Bestätigungsseite ("Wollen Sie wirklich:") die Abfrage (alles mit rotem Hintergrund)
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
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.
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"
genehmigungsexternes_system hängt von genehmigungsanforderung ab
Adresse hängt vom Kunden ab
Kundenidentifikation hängt vom Kunden ab
external_id hängt vom Kunden ab
Der Berechtigungsnachweis hängt vom Kunden ab
email_address hängt vom Kunden ab
Approval_Request hängt vom Kunden ab
customer_status hängt vom Kunden ab
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 2972 approval_external_system 03 approval_request 04 country 1895 credential 4686 customer 67767 customer_identification 56318 customer_image 29 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
Tabellenadresse abschneiden
Tabelle Approval_external_system abschneiden
Abschneiden der Tabelle genehmigungsanforderung
Tabellenland abschneiden
Tabellenanmeldeinformationen abschneiden
Kunden abschneiden
Abschneiden der Tabelle customer_identification
Tabelle customer_image abschneiden
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 02 approval_external_system 03 approval_request 04 country 05 credential 06 customer 07 customer_identification 08 customer_image 09 customer_status 010 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
Die folgende MySQL-Abfrage erzeugt selbst eine einzelne Abfrage, die alle Tabellen in einer bestimmten Datenbank abschneidet. Es umgeht AUSLÄNDISCHE Schlüssel:
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.
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
Antworten:
Löschen (dh Tabellen entfernen)
Abschneiden (dh leere Tabellen)
quelle
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
Schneiden Sie mehrere Datenbanktabellen auf der MySQL-Instanz ab
Verwenden Sie das Abfrageergebnis, um Tabellen abzuschneiden
Hinweis: Möglicherweise wird folgende Fehlermeldung angezeigt:
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:
Schneiden Sie Ihre Tabellen ab und ändern Sie sie wieder in
quelle
Verwenden Sie phpMyAdmin folgendermaßen:
Wenn Sie Fremdschlüsselprüfungen ignorieren möchten, können Sie das Kontrollkästchen deaktivieren:
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!
quelle
MS SQL Server 2005+ (PRINT für die tatsächliche Ausführung entfernen ...)
Wenn Ihre Datenbankplattform INFORMATION_SCHEMA-Ansichten unterstützt, nehmen Sie die Ergebnisse der folgenden Abfrage und führen Sie sie aus.
Versuchen Sie dies für MySQL:
Das Hinzufügen eines Semikolons zum Concat erleichtert die Verwendung, z. B. innerhalb der MySQL-Workbench.
quelle
Ich fand dies, um alle Tabellen in einer Datenbank zu löschen:
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:
funktioniert bei mir --edit, behebt einen Tippfehler im letzten Befehl
quelle
quelle
SELECT
:AND table_schema = DATABASE();
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;
quelle
Dadurch wird der Befehl zum Abschneiden aller Tabellen gedruckt:
quelle
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.
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.
quelle
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 TABLE
mit dieser gespeicherten Prozedur aufrufen :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-tables
und--no-data
Optionen Drop und erstellen Sie alle Tabellen , um die Daten zu ignorieren. so was:mysqldump-Verwendungshandbuch von dev.mysql
quelle
Verwenden Sie dies und bilden Sie die Abfrage
Verwenden Sie dies nun, um diese Abfrage zu verwenden
wenn Sie eine solche Fehlermeldung erhalten
Der einfachste Weg ist, diese Zeile oben in Ihrer Datei hinzuzufügen
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.
quelle
Nein. Es gibt keinen einzigen Befehl, um alle MySQL-Tabellen gleichzeitig abzuschneiden. Sie müssen ein kleines Skript erstellen, um die Tabellen einzeln abzuschneiden.
ref: http://dev.mysql.com/doc/refman/5.0/en/truncate-table.html
quelle
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:
Sobald Sie diese gespeicherte Prozedur in Ihrer util-Datenbank haben, können Sie sie wie folgt aufrufen
das ist jetzt genau eine aussage :-)
quelle
hier, denn ich weiß hier
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:
Schneiden Sie Ihre Tabellen ab und ändern Sie sie wieder in
Benutzer diesen PHP-Code
Detail hier überprüfen Link
quelle
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
quelle
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.
quelle
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.
quelle
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:
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.
quelle
- -
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:
Listen Sie die Tabellen und Zeilenzahlen auf:
Schneiden Sie Ihre Tabellen ab:
Stellen Sie sicher, dass es funktioniert hat:
Auf einer Windows-Box:
HINWEIS:
cpm ist der Datenbankname
quelle
Die folgende MySQL-Abfrage erzeugt selbst eine einzelne Abfrage, die alle Tabellen in einer bestimmten Datenbank abschneidet. Es umgeht AUSLÄNDISCHE Schlüssel:
quelle
quelle
Lösung 1)
Lösung 2)
- bearbeiten ----
quelle
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
quelle
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?
quelle
Hier ist ein Code-Snippet, mit dem ich eine Tabelle lösche. Ändern Sie einfach $ conn info und TABLE_NAME.
quelle