Mit Bedingung abschneiden
truncate ->dies setzt die gesamte Tabelle, gibt es eine Möglichkeit via truncate zurücksetzen bestimmten records/Bedingungen prüfen.
Ex: ich will zurücksetzen, um alle Daten und halten der letzten 30 Tage innerhalb der Tabelle.
Dank.
InformationsquelleAutor der Frage Sharpeye500 | 2010-09-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein,
TRUNCATE
ist alles oder nichts. Sie können eineDELETE FROM <table> WHERE <conditions>
aber damit verliert der Geschwindigkeit VorteileTRUNCATE
.InformationsquelleAutor der Antwort ceejayoz
Die kurze Antwort ist keine: MySQL unterstützt nicht ermöglichen Ihnen das hinzufügen einer
WHERE
- Klausel, um dieTRUNCATE
- Anweisung. Hier ist Die MySQL-Dokumentation über dieTRUNCATE
- Anweisung.Aber die gute Nachricht ist, dass Sie (etwas) umgehen Sie diese Einschränkung.
Einfach, sicher, sauber, aber langsam-Lösung mit
DELETE
Vor allem, wenn die Tabelle klein genug ist, verwenden Sie einfach die
DELETE
- Anweisung (es musste erwähnt werden):Den
LOCK
undUNLOCK
Aussagen sind nicht verpflichtend, aber Sie wird die Dinge beschleunigen und vermeiden potenzielle deadlocks.Leider sehr langsam, wenn Sie Ihre Tabelle zu groß ist... und da sind Sie erwägen, mit der
TRUNCATE
Aussage, ich nehme an, es ist, weil Ihre Tabelle zu groß ist.Also hier ist ein Weg, um Ihr problem zu lösen mit der
TRUNCATE
Aussage:Einfache, schnelle, aber unsichere Lösung mit
TRUNCATE
Leider, diese Lösung ist ein bisschen unsicher, wenn andere Prozesse einfügen von Datensätzen in die Tabelle zur gleichen Zeit:
TRUNCATE
Anweisung setzt dieAUTO-INCREMENT
Zähler auf null. Also, jeder Datensatz eingefügt, der zwischen den Schritten 2 und 3 wird eine ID haben, die niedriger sein wird als die ältere IDs und vielleicht sogar zu Konflikten mit den IDs eingefügt in Schritt 4 (beachten Sie, dass dieAUTO-INCREMENT
Zähler wird zurück zu seiner richtigen Wert nach Schritt 4).Leider ist es nicht möglich, um die Tabelle zu sperren und es abschneiden. Aber wir können (irgendwie) arbeiten rund , dass Beschränkung der Verwendung
RENAME
.Halb-einfach, schnell, sicher, aber laut Lösung mit
TRUNCATE
Sollte dies völlig sicher und ganz schnell. Das problem ist nur, dass andere Prozesse siehe Tabelle
my_table
verschwinden für ein paar Sekunden. Dies könnte zu Fehlern führen, angezeigt wird, in den logs überall. So ist es eine sichere Lösung, aber es ist "laut".Haftungsausschluss: ich bin kein MySQL-Experte, so dass diese Lösungen könnte in der Tat beschissen. Die einzige Garantie, die ich anbieten kann ist, dass Sie arbeiten gut für mich. Wenn einige Experten kommentieren auf diese Lösungen wäre ich dankbar.
InformationsquelleAutor der Antwort MiniQuark
Können Sie einfach exportieren Sie die Tabelle mit einer Abfrage die Klausel mit datapump und importieren Sie es dann wieder mit table_exists_action=replace-Klausel. Seine drop und erstellen Sie Ihre Tabelle und nehmen sehr weniger Zeit. Bitte Lesen Sie darüber, bevor Sie Sie implementieren.
InformationsquelleAutor der Antwort user4603856
Als Antwort auf deine Frage:
"ich will zurücksetzen, um alle Daten und halten der letzten 30 Tage innerhalb der Tabelle."
können Sie ein Ereignis erstellen. Überprüfen Sie https://dev.mysql.com/doc/refman/5.7/en/event-scheduler.html
Beispiel:
Ausgeführt wird eine tägliche Bereinigung in der Tabelle, halten Sie die letzten 30 Tage Daten verfügbar
InformationsquelleAutor der Antwort Felipe Torres