MySQL - Datenbank automatisch leeren
13. Dezember 2007
Dennis hat mich vor Kurzem gefragt, ob man alle Tabellen einer Datenbank leeren kann, da er einen Import testen musste. Verteilt dieser sich auf eine Menge Tabellen, dessen Anzahl sich während der Entwicklung noch verändern kann, ist Handarbeit angesagt. Passenderweise bietet SQL genau dafür den Befehl truncate an. Die Tabelle wird gelöscht und mit ihrem ursprünglichen create-Statement wieder erzeugt. Deshalb ist truncate auch erheblich schneller als delete.
Möchte man aber jetzt alle Tabellen in einer Datenbank leeren, kann man dafür ein Script per Hand anlegen, welches alle Tabellennamen enthält oder lieber eine Prozedur schreiben (oder jetzt hier runterladen), die einem die Arbeit abnimmt
DROP PROCEDURE IF EXISTS `trunc_db`;
DELIMITER /
CREATE PROCEDURE `trunc_db`(db VARCHAR(64))
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE tbl VARCHAR(255);
DECLARE cur CURSOR FOR
SELECT table_name
FROM information_schema.tables
WHERE table_type ='BASE TABLE' AND TABLE_SCHEMA = db;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN cur;
REPEAT
FETCH cur INTO tbl;
SET @s = CONCAT('TRUNCATE `', db, '`.`', tbl, '`');
PREPARE stm FROM @s;
IF NOT done THEN
EXECUTE stm;
END IF;
UNTIL done END REPEAT;
CLOSE cur;
END;
/
DELIMITER ;
Das Script kann hier runtergeladen werden. Die Prozedur prüft nicht auf vorhandene Fremdschlüssel, es kann also vorkommen, dass sie auf Grund einer Constraint-Verletzung nicht durchläuft. Viel Spaß beim Erweitern der Prozedur ![]()