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.
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.
Antworten:
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
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;
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!
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
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
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
: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;
SET FOREIGN_KEY_CHECKS=0;
TRUNCATE `table1`;
TRUNCATE `table2`;
TRUNCATE `table3`;
TRUNCATE `table4`;
TRUNCATE `table5`;
TRUNCATE `table6`;
TRUNCATE `table7`;
SET FOREIGN_KEY_CHECKS=1;
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');
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.
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 :
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-tables
und --no-data
Optionen Drop und erstellen Sie alle Tabellen , um die Daten zu ignorieren. so was:
mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE]
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.
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
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 :-)
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
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 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'''
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.
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.
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"
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
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
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
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
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
<?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.