MySQL är världens mest populära open source-databas, känd för sin hastighet och tillförlitlighet. Den här artikeln tittar på hur du tar bort alla data från en MySQL-databastabell och hur det påverkar automatiska inkrementella fält.
ta bort och avkorta
det finns två sätt att ta bort alla data i en MySQL-databastabell.
TRUNCATE TABLE tablename;
detta tar bort all data i tabellen mycket snabbt. I MySQL tappas tabellen faktiskt och återskapas, därmed hastigheten på frågan. Antalet raderade rader för MyISAM-tabeller som returneras är noll; för INNODB returnerar det faktiska numret raderat.
DELETE FROM tablename;
detta tar också bort alla data i tabellen, men är inte lika snabb som att använda metoden” TRUNCATE TABLE”. I MySQL>= 4.0 returneras antalet rader som raderas; i MySQL 3.23 är det returnerade numret alltid noll.
automatiska Inkrementkolumner för MyISAM-tabeller
Om du har en primär nyckelkolumn för automatisk inkrement i MyISAM-tabellen blir resultatet något annorlunda beroende på vilken borttagningsmetod du använder. När du använder metoden ”TRUNCATE TABLE” återställs värdet för automatisk ökning av utsäde till 1. När du använder ”Ta bort från” – metoden kommer auto increment seed att lämnas som det var tidigare (t.ex. om auto increment-fältet för den senaste infogade posten var 123 kommer nästa infogade post att ställas in på 124).
Observera att detta gäller för MySQL >= 4.0; från min läsning av TRUNCATE manualsidan i MySQL 3.23 TRUNCATE fungerar precis som DELETE vilket skulle innebära att auto increment seed inte återställs. Jag har för närvarande inte en 3.23-databas inställd för att testa den så kan inte bekräfta detta.
Automatisk Inkrementkolumner för INNODB-tabeller
för INNODB-tabeller, oavsett om du använder metoderna ”TRUNCATE TABLE” eller ”DELETE FROM”, återställs inte fältet automatisk inkrement. Om du infogade 5 poster i en ny tabell, raderade alla poster och infogade en annan post, skulle fältet ha ett värde på 6, oavsett vilken metod du använde.
Uppdatering 17 Feb 2009: Jag skrev ursprungligen detta inlägg när MySQL 4.0 var den aktuella versionen. Jag har just testat ovanstående nu på ett INNODB-bord med MySQL 5.0 och använder TRUNCATE återställer auto increment-fältet tillbaka till standard. Så antingen förändrade beteendet någon gång eller jag var felaktig när jag gjorde ovanstående uttalande.
är du verkligen säker på att du vill radera all data?
innan du tar bort alla data i en databas bör du se till att du verkligen tänker ta bort alla data. Det lönar sig ofta först att ”Välj * från tablename” eller ”välj COUNT(*) från tablename” innan du gör det för att kontrollera att det verkligen är säkert att ta bort all data. Kanske vill du verkligen göra något som ”ta bort från tablename där foo = ’bar'” istället.