dedlfix: Ganzen Inhalt aus Tabelle löschen?

Beitrag lesen

Hi!

Die Ausgangsfrage war:

aber woher weisst du, dass auf die tabelle nicht referenziert wird.
Ist das nicht egal? Gelöscht ist gelöscht, egal ob einzeln oder in einen Rutsch.
ganz und gar nicht. TRUNCATE und DELETE mögen schnittmengen haben, aber tun letztlich zwei verschiedene dinge.

Man kann das auch so sehen, dass sie das gleiche tun, aber mit unterschiedlichen Nebenwirkungen. Wie auch immer, mit der Ausgangsfrage hat das nicht mehr viel zu tun. Als Anwender muss ich zur Entscheidung, ob ich DELETE oder TRUNCATE verwende, nicht die Referenzlage berücksichtigen (so man denn überhaupt InnoDB verwendet). Das macht MySQL schon von selbst. Andere Kriterien: siehe unten.

ich habe zwar in beiden fällen eine leere tabelle mit gleichen namen, ich habe aber nicht mehr die gleiche tabelle.

Was hat das für praktische Auswirkungen ob die Tabelle die selbe ist oder eine genaue Kopie? Abgesehen von den dokumentierten Details in den Nebenwirkungen.

die mysql doku suggeriert da was, was so nicht stimmt,

Das kann ich nicht daraus entnehmen, sie listet sehr genau die Unterschiede zwischen beiden Verfahren auf. Gleich zu Anfang wird darauf in einem Atemzug hingewiesen: "Logically, TRUNCATE TABLE is equivalent to a DELETE statement that deletes all rows, but there are practical differences under some circumstances." (auch in der Übersetzung)

zumal in der deutschen übersetzung meiner meinung nach auch ein fehler drin ist.

Deswegen vermeide ich, im fachlichen Bereich Übersetzungen zu verwenden.

dort steht: "Bei InnoDB-Tabellen wird TRUNCATE TABLE auf DELETE umgesetzt, sofern keine Fremdschlüssel-Constraints vorhanden sind, die die Tabelle referenzieren". das müsste aber genau umgekehrt sein.

Das "keine" ist zu viel. Das Original liest sich auch anders. Die Übersetzung ist jedenfalls inhaltlich nicht (mehr) auf dem 1:1-Stand. Ich verfolge die Änderungen im deutschen Teil nicht, aber mir scheint, dass seit der Übersetzung viele Dinge (Kapitelstruktur und Inhalt) im Original geändert jedoch in der deutschen Übersetzung nicht nachgezogen wurden.

hinzu kommt, dass bei einem TRUNCATE der autoincrement wert sich resetet, die meta daten sollten sich auch verändern, es wird ein impliziter commit ausgeführt (DDL Statement) und delete triggers nicht gefeuert. das es keinen rückegabewert der gelöschten datensätze gibt, ist wohl noch der kleineste unterschied. aber davon zu reden, es wäre das gleiche, dem will ich so nicht zustimmen. man muss da sehr genau klären, ob es das richtige ist.

Das steht ja alles so in der Dokumentation (zumindest in der englichen), und das sind in meinen Augen alles mehr oder weniger Kleinigkeiten. Auf geschätzt 90% der Anwender MySQLs, die komplette Tabellen löschen wollen, werden die Unterschiede keine Auswirkungen haben.

Auf alle Fälle ist es eine Alternative zu DELETE, die nicht unerwähnt bleiben sollte. Die Entscheidung muss letztlich immer der Verwender selbst treffen. Dass die Unterschiede oder besser gesagt die Eigenschaften von als Antwort Genanntem selten bis nie bis ins kleinste Detail aufgeführt werden, würde ich niemandem ankreiden wollen, solange sie nicht für Aspekte der Frage oder aus der allgemeinen Erfahrung heraus wichtig sind.

Lo!