TRUNCATE vs. DELETE

Hallo!

Kann mir jemand den genauen Unterschied zwischen truncate und delete erläutern und wann welches Kommando eingesetzt werden sollte?

Konkret hatte ich gerade mit truncate das Problem die Tabelle nicht leeren zu können, da unique/primary key constraints auf der Tabelle angelegt waren.
Wo liegt hier das Problem, wenn ich alle Daten löschen möchte?

Vielen Dank vorab für eure Hilfe!!

Philipp

Hi,

Kann mir jemand den genauen Unterschied zwischen truncate und
delete erläutern und wann welches Kommando eingesetzt werden
sollte?

Delete geht über das Transaction-log (und kann damit zB. von Triggern ausgewertet werden)

Truncate leert die Tabelle ohne Umschweife. (unter dBase III entsprach das dem ZAP)

Bei großen Datenmengen ist „delete“ manchmal sehr langsam. Dann sind Strategien wie umkopieren in in Temp-tabellen, alte Tabelle löschen und temp-tabelle umbenennen oft schneller. Hängt aber von deiner DB und Struktur ab.

Konkret hatte ich gerade mit truncate das Problem die Tabelle
nicht leeren zu können, da unique/primary key constraints auf
der Tabelle angelegt waren.
Wo liegt hier das Problem, wenn ich alle Daten löschen möchte?

Keine Ahnung da ich weder die Constrains (foreign key?) noch die Datenbank kenne mit der du arbeitest.

Gruss
joey

Hi!

Wenn Du noch das DB-System preis gibst, wäre es noch einfacher.

Eine Antwort hast Du schon bekommen, ein weiteres liegt an der technischen Durchführung der Aktionen:

DELETE: ein Löschen von Datensätzen, inkl. aller Einträge in Logs usw. (unter Oracle reicht hier ein stinknormaler Delete-Grant.

TRUNCATE: Die Tabelle wird gedroppt und neu angelegt - so braucht man unter Oracle beispielsweise ein Create- und Drop-Any-Table-Grant (also wesentlich mächtigerere Rechte als für ein Kinderkram-Delete :wink:

Konkret hatte ich gerade mit truncate das Problem die Tabelle
nicht leeren zu können, da unique/primary key constraints auf
der Tabelle angelegt waren.

Die UKs und PKs werden sicherlich NICHT das Problem gewesen sein, eher die FKs, die auf die Tabelle zeigen.
Bei einem Delete erfolgt der Check lediglich auf den zu löschenden Datensatz (ob es Beziehung auf ihn gibt); beim Truncate ist der DB wurscht, ob es Beziehungen gibt oder nicht, es darf nicht mal eine _theoretische existieren - also gehören diese Beziehung vorher deaktiviert/gelöscht.

Wo liegt hier das Problem, wenn ich alle Daten löschen möchte?

Ein FK von einer anderen Tabelle … schätze ich.

Grüße,
Tomh_

TRUNCATE: Die Tabelle wird gedroppt und neu angelegt - so
braucht man unter Oracle beispielsweise ein Create- und
Drop-Any-Table-Grant (also wesentlich mächtigerere
Rechte als für ein Kinderkram-Delete :wink:

Hi,

so kompliziert macht Oracle das doch gar nicht. Wozu neu anlegen (immerhin eine ziemlich aufwändige Aktion) - es reicht doch, wenn die DB-Blocks der Tabelle als leer gekennzeichnet werden.

_Use the TRUNCATE statement to remove all rows from a table or cluster. By default, Oracle Database also deallocates all space used by the removed rows except that specified by the MINEXTENTS storage parameter and sets the NEXT storage parameter to the size of the last extent removed from the segment by the truncation process.

Removing rows with the TRUNCATE statement can be more efficient than dropping and re-creating a table. Dropping and re-creating a table invalidates dependent objects of the table, requires you to regrant object privileges on the table, and requires you to re-create the indexes, integrity constraints, and triggers on the table and respecify its storage parameters. Truncating has none of these effects._

gruss
bernhard

Hi!

so kompliziert macht Oracle das doch gar nicht. Wozu neu
anlegen (immerhin eine ziemlich aufwändige Aktion) - es reicht
doch, wenn die DB-Blocks der Tabelle als leer gekennzeichnet
werden.

Das stimmt natürlich (wobei auch noch der benötigte Platz im Tablespace allokiert bleibt oder nicht, je nach Truncate-Parameter), trotzdem benötigt man die DDL-Rechte - und das kann in Ausnahmefällen ein ziemlicher Knackpunkt werden …

Grüße,
Tomh

Kleiner Hinweis an der Stelle, die logs werden natürlich nicht gelöscht! Das wäre verherend für die Serveranlagen und die Datenbankperformanz. Ein Backup, wäre nicht mehr möglich und das des ACID-Prinzip aufs gröbste verletzt.

Gruss
QL

P.S. Die Frage, was ein bestimmtes Query genau tut, kann nur beantwortet werden, wenn genau bekannt ist, welche DB und auch welche Version des Query-Optimizers und Engine im Einsatz ist. Ist eine DB, wie Oracle im Einsatz kann das generell nur vom Prinzip her beantwortet werden, da die Oracle-DB nicht Open Source ist.