2011-01-08 9 views
5

Ich habe eine Tabelle mit mehr als 100000 Datenelementen, aber es gibt fast 350 leere Zeilen innerhalb. Wie lösche ich diese leeren Zeilen mit phpmyadmin? Das manuelle Löschen ist eine langwierige Aufgabe.Wie lösche ich leere Zeilen in Mysql?

+0

Können Sie Ihre Tabellenstruktur posten, und welche Felder sollten auch leer sein, damit der komplette Datensatz als leer angesehen wird? –

Antwort

24

Die allgemeine Antwort lautet:

DELETE FROM table_name WHERE some_column = ''; 

oder

DELETE FROM table_name WHERE some_column IS NULL; 

See: http://dev.mysql.com/doc/refman/5.0/en/delete.html

Weitere Informationen, wenn Sie Ihre Tabellen schreiben ~

Auch sicher sein, zu tun! :

SELECT * FROM table_name WHERE some_column = ''; 

bevor Sie löschen, damit Sie sehen können, welche Zeilen Sie löschen! Ich denke in phpMyAdmin kannst du einfach nur die Auswahl treffen und dann "alle auswählen" und löschen, bin mir aber nicht sicher. Das wäre ziemlich schnell und sehr sicher.

3

Ich habe ein PHP-Skript, das leere Zeilen basierend auf Spaltendatentypen automatisch entfernt.

Das erlaubt mir, "Leere" für verschiedene Spaltentypen unterschiedlich zu definieren.

z.B.

table 
first_name (varchar) | last_name (varchar) | some_qty (int) | other_qty (decimal) 

DELETE FROM `table` WHERE 
(`first_name` IS NULL OR `first_name` = '') 
AND 
(`last_name` IS NULL OR `last_name` = '') 
AND 
(`some_qty` IS NULL OR `some_qty` = 0) 
AND 
(`other_qty` IS NULL OR `other_qty` = 0) 

Da "0" Werte in meinem System bedeutungslos sind, ich zähle sie als leer. Aber ich habe herausgefunden, dass wenn du das tust (first_name = 0), dann wirst du immer wahr werden, weil Strings immer == 0 in MySQL sind. Also schneide ich die Definition von "leer" auf den Datentyp.

4

Ich mache die mysql Operation in der Eingabeaufforderung in Windows. Und die Grund Anfragen:

delete * from table_name where column='' 

und

delete * from table_name where column='NULL' 

funktioniert nicht. Ich weiß nicht, ob es in phpmyadmin sqlcommand builder funktioniert. Wie auch immer:

delete * from table_name where column is NULL 

funktioniert gut.

1

Diese Prozedur löscht alle Zeilen für alle Spalten, die NULL sind und ignoriert die primäre Spalte, die als ID festgelegt werden kann. Ich hoffe es hilft dir.

DELIMITER // 
CREATE PROCEDURE DeleteRowsAllColNull(IN tbl VARCHAR(64)) 
BEGIN 
SET @tbl = tbl; 
SET SESSION group_concat_max_len = 1000000; 
SELECT CONCAT('DELETE FROM `',@tbl,'` WHERE ',(REPLACE(group_concat(concat('`',COLUMN_NAME, '` is NULL')),',',' AND ')),';') FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = @tbl AND COLUMN_KEY NOT LIKE 'PRI' into @delete_all; 
PREPARE delete_all FROM @delete_all; 
EXECUTE delete_all; 
DEALLOCATE PREPARE delete_all; 
END // 
DELIMITER ; 

Führen Sie das Verfahren wie folgt aus.

CALL DeleteRowsAllColNull('your table'); 
0

Ich weiß, das bereits beantwortet wurde und eine Zecke bekam, aber ich schrieb dies eine kleine Funktion zu tun, und dachte, es für andere Menschen nützlich sein könnte.

Ich rufe meine Funktion mit einem Array, so dass ich die gleiche Funktion für verschiedene Tabellen verwenden kann.

$tableArray=array("Address", "Email", "Phone"); //This is the column names 
$this->deleteBlankLines("tableName",$tableArray); 

und hier ist die Funktion, die das Array nimmt und baut den Lösch Zeichenfolge

private function deleteBlankLines($tablename,$columnArray){ 
    $Where=""; 
    foreach($columnArray as $line): 
     $Where.="(`".$line."`=''||`".$line."` IS NULL) && "; 
    endforeach; 
    $Where = rtrim($Where, '&& '); 
    $query="DELETE FROM `{$tablename}` WHERE ".$Where; 
    $stmt = $this->db->prepare($query); 
    $stmt->execute(); 
} 

Sie diese Funktion für mehrere Tabellen verwenden kann. Sie müssen nur einen anderen Tabellennamen und ein anderes Array senden und es wird funktionieren.

Meine Funktion wird gleichzeitig nach einer ganzen Reihe leerer Spalten oder NULL-Spalten suchen. Wenn Sie nicht nach NULL suchen müssen, können Sie diesen Teil entfernen.