Was ist der Unterschied zwischen TRUNCATE
und DELETE
in SQL?
Wenn Ihre Antwort plattformspezifisch ist, geben Sie dies bitte an.
Was ist der Unterschied zwischen TRUNCATE
und DELETE
in SQL?
Wenn Ihre Antwort plattformspezifisch ist, geben Sie dies bitte an.
Antworten:
Hier ist eine Liste der Unterschiede. Ich habe Oracle-spezifische Funktionen hervorgehoben, und hoffentlich kann die Community auch den spezifischen Unterschied anderer Anbieter hinzufügen. Unterschiede, die den meisten Anbietern gemeinsam sind, können direkt unter den Überschriften auftreten, wobei die Unterschiede unten hervorgehoben werden.
Wenn Sie schnell alle Zeilen aus einer Tabelle löschen möchten und wirklich sicher sind, dass Sie dies tun möchten und keine Fremdschlüssel für die Tabellen haben, ist ein TRUNCATE wahrscheinlich schneller als ein DELETE .
Verschiedene systemspezifische Probleme müssen berücksichtigt werden, wie nachstehend beschrieben.
Löschen ist DML, Abschneiden ist DDL ( Was ist DDL und DML? )
Variabel nach Anbieter
SQL Server
Abschneiden kann zurückgesetzt werden.
PostgreSQL
Abschneiden kann zurückgesetzt werden.
Orakel
Da ein TRUNCATE DDL ist, sind zwei Commits erforderlich, eines vor und eines nach der Ausführung der Anweisung. Das Abschneiden kann daher nicht rückgängig gemacht werden, und ein Fehler beim Abschneiden hat ohnehin ein Commit ausgelöst.
Siehe jedoch Rückblende unten.
Durch Löschen wird kein Speicherplatz wiederhergestellt, durch Abschneiden wird Speicherplatz wiederhergestellt
Orakel
Wenn Sie die REUSE STORAGE-Klausel verwenden, werden die Datensegmente nicht freigegeben. Dies kann geringfügig effizienter sein, wenn die Tabelle mit Daten neu geladen werden soll. Die Hochwassermarke wird zurückgesetzt.
Mit Löschen können alle Zeilen oder nur eine Teilmenge von Zeilen entfernt werden. Abschneiden entfernt alle Zeilen.
Orakel
Wenn eine Tabelle partitioniert ist, können die einzelnen Partitionen isoliert abgeschnitten werden, sodass alle Daten der Tabelle teilweise entfernt werden können.
Löschen kann auf Tabellen und Tabellen innerhalb eines Clusters angewendet werden. Abschneiden gilt nur für Tabellen oder den gesamten Cluster. (Kann Oracle-spezifisch sein)
Orakel
Das Löschen wirkt sich nicht auf die Datenobjekt-ID aus, aber das Abschneiden weist eine neue Datenobjekt-ID zu, es sei denn, seit ihrer Erstellung wurde noch nie eine Einfügung für die Tabelle vorgenommen. Selbst eine einzelne Einfügung, die zurückgesetzt wird, führt dazu, dass beim Abschneiden eine neue Datenobjekt-ID zugewiesen wird .
Rückblende funktioniert über Löschvorgänge hinweg, aber ein Abschneiden verhindert Rückblende in Zustände vor dem Vorgang.
Ab 11gR2 ermöglicht die FLASHBACK ARCHIVE-Funktion dies jedoch, außer in der Express Edition
Verwendung von FLASHBACK in Oracle http://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_flashback.htm#ADFNS638
Variable
Orakel
Das Löschen kann für eine Tabelle einem anderen Benutzer oder einer anderen Rolle gewährt werden, das Abschneiden jedoch nicht ohne die Verwendung einer DROP ANY TABLE-Berechtigung.
Löschen erzeugt eine kleine Menge an Wiederherstellen und eine große Menge an Rückgängigmachen. Abschneiden erzeugt jeweils eine vernachlässigbare Menge.
Orakel
Eine Kürzungsoperation macht unbrauchbare Indizes wieder verwendbar. Löschen nicht.
Ein Abschneiden kann nicht angewendet werden, wenn ein aktivierter Fremdschlüssel auf die Tabelle verweist. Die Behandlung mit Löschen hängt von der Konfiguration der Fremdschlüssel ab.
Orakel
Abschneiden erfordert eine exklusive Tabellensperre, Löschen erfordert eine gemeinsame Tabellensperre. Das Deaktivieren von Tabellensperren ist daher eine Möglichkeit, das Abschneiden von Vorgängen für eine Tabelle zu verhindern.
DML-Trigger werden beim Abschneiden nicht ausgelöst.
Orakel
DDL-Trigger sind verfügbar.
Orakel
Abschneiden kann nicht über eine Datenbankverbindung ausgegeben werden.
SQL Server
Durch Abschneiden wird die Sequenz für IDENTITY-Spaltentypen zurückgesetzt, durch Löschen nicht.
In den meisten Implementierungen a DELETE
Anweisung die gelöschten Zeilen an den Client zurückgeben.
Beispiel: In einem Oracle PL / SQL-Unterprogramm können Sie:
DELETE FROM employees_temp
WHERE employee_id = 299
RETURNING first_name,
last_name
INTO emp_first_name,
emp_last_name;
Der Unterschied zwischen Abschneiden und Löschen ist unten aufgeführt:
+----------------------------------------+----------------------------------------------+
| Truncate | Delete |
+----------------------------------------+----------------------------------------------+
| We can't Rollback after performing | We can Rollback after delete. |
| Truncate. | |
| | |
| Example: | Example: |
| BEGIN TRAN | BEGIN TRAN |
| TRUNCATE TABLE tranTest | DELETE FROM tranTest |
| SELECT * FROM tranTest | SELECT * FROM tranTest |
| ROLLBACK | ROLLBACK |
| SELECT * FROM tranTest | SELECT * FROM tranTest |
+----------------------------------------+----------------------------------------------+
| Truncate reset identity of table. | Delete does not reset identity of table. |
+----------------------------------------+----------------------------------------------+
| It locks the entire table. | It locks the table row. |
+----------------------------------------+----------------------------------------------+
| Its DDL(Data Definition Language) | Its DML(Data Manipulation Language) |
| command. | command. |
+----------------------------------------+----------------------------------------------+
| We can't use WHERE clause with it. | We can use WHERE to filter data to delete. |
+----------------------------------------+----------------------------------------------+
| Trigger is not fired while truncate. | Trigger is fired. |
+----------------------------------------+----------------------------------------------+
| Syntax : | Syntax : |
| 1) TRUNCATE TABLE table_name | 1) DELETE FROM table_name |
| | 2) DELETE FROM table_name WHERE |
| | example_column_id IN (1,2,3) |
+----------------------------------------+----------------------------------------------+
FALLEN
Der Befehl DROP entfernt eine Tabelle aus der Datenbank. Alle Zeilen, Indizes und Berechtigungen der Tabellen werden ebenfalls entfernt. Es werden keine DML-Trigger ausgelöst. Der Vorgang kann nicht zurückgesetzt werden.
KÜRZEN
TRUNCATE entfernt alle Zeilen aus einer Tabelle. Der Vorgang kann nicht zurückgesetzt werden und es werden keine Trigger ausgelöst. Daher ist TRUNCATE schneller und benötigt nicht so viel Speicherplatz wie ein DELETE. Beim Abschneiden wird eine Sperre auf Tabellenebene hinzugefügt.
LÖSCHEN
Mit dem Befehl DELETE werden Zeilen aus einer Tabelle entfernt. Eine WHERE-Klausel kann verwendet werden, um nur einige Zeilen zu entfernen. Wenn keine WHERE-Bedingung angegeben ist, werden alle Zeilen entfernt. Nach dem Ausführen eines DELETE-Vorgangs müssen Sie die Transaktion COMMIT oder ROLLBACK ausführen, um die Änderung dauerhaft zu machen oder rückgängig zu machen. Beachten Sie, dass bei diesem Vorgang alle DELETE-Trigger auf dem Tisch ausgelöst werden. Beim Löschen wird eine Sperre auf Zeilenebene hinzugefügt.
Von: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
Alle guten Antworten, zu denen ich hinzufügen muss:
Da TRUNCATE TABLE
es sich um eine DDL ( Data Defination Language ) und nicht um einen DML- Befehl ( Data Manipulation Langauge ) handelt, werden Delete Triggers
diese nicht ausgeführt.
Zusammenfassung von Löschen gegen Abschneiden in SQL Server
Für einen vollständigen Artikel folgen Sie diesem Link: http://codaffection.com/sql-server-article/delete-vs-truncate-in-sql-server/
Entnommen aus dem Dotnet-Mob-Artikel: Löschen gegen Abschneiden in SQL Server
Wenn bei SQL Server oder MySQL eine PK mit automatischer Inkrementierung vorhanden ist, wird durch Abschneiden der Zähler zurückgesetzt.
DBCC CHECKIDENT (table_name, RESEED, 1)
"Abschneiden protokolliert nichts" ist korrekt. Ich würde weiter gehen:
Abschneiden wird nicht im Kontext einer Transaktion ausgeführt.
Der Geschwindigkeitsvorteil des Abschneidens gegenüber dem Löschen sollte offensichtlich sein. Dieser Vorteil reicht je nach Situation von trivial bis enorm.
Ich habe jedoch gesehen, dass das Abschneiden unbeabsichtigt die referenzielle Integrität verletzt und andere Einschränkungen verletzt. Die Leistung, die Sie durch das Ändern von Daten außerhalb einer Transaktion gewinnen, muss gegen die Verantwortung abgewogen werden, die Sie erben, wenn Sie die Gratwanderung ohne Netz unternehmen.
TRUNCATE
ist die DDL-Anweisung, während DELETE
es sich um eine DML-Anweisung handelt. Nachfolgend sind die Unterschiede zwischen den beiden aufgeführt:
Wie TRUNCATE
bei einer DDL- Anweisung ( Data Definition Language ) ist kein Commit erforderlich, um die Änderungen dauerhaft zu machen. Dies ist der Grund, warum durch Abschneiden gelöschte Zeilen nicht zurückgesetzt werden konnten. Auf der anderen Seite erfordert DELETE
eine DML- Anweisung ( Data Manipulation Language ) ein explizites Commit, um ihre Wirkung dauerhaft zu machen.
TRUNCATE
Entfernt immer alle Zeilen aus einer Tabelle, wobei die Tabelle leer und die Tabellenstruktur intakt DELETE
bleibt. Bei Verwendung der where-Klausel kann dies jedoch bedingt entfernt werden.
Die durch die TRUNCATE TABLE
Anweisung gelöschten Zeilen können nicht wiederhergestellt werden, und Sie können die where-Klausel in der TRUNCATE
Anweisung nicht angeben .
TRUNCATE
Aussagen feuern nicht Trigger ab auf auf DELETE - Trigger gegen DELETE
Aussage
Hier ist der sehr gute Link zum Thema relevant.
Ja, DELETE ist langsamer, TRUNCATE ist schneller. Warum?
DELETE muss die Datensätze lesen, Einschränkungen überprüfen, den Block aktualisieren, Indizes aktualisieren und Wiederherstellen / Rückgängigmachen generieren. All das braucht Zeit.
TRUNCATE passt einfach einen Zeiger in der Datenbank für die Tabelle (die High Water Mark) und den Poof an! Die Daten sind weg.
Dies ist Oracle-spezifisch, AFAIK.
KÜRZEN
Die SQL-Abfrage TRUNCATE entfernt alle Zeilen aus einer Tabelle, ohne die einzelnen Zeilenlöschungen zu protokollieren.
LÖSCHEN
Um eine DELETE-Warteschlange auszuführen, sind Löschberechtigungen für die Zieltabelle erforderlich. Wenn Sie eine WHERE-Klausel in einem DELETE verwenden müssen, sind auch ausgewählte Berechtigungen erforderlich.
Wenn Sie versehentlich alle Daten mit Löschen / Abschneiden aus der Tabelle entfernt haben. Sie können festgeschriebene Transaktionen zurücksetzen. Stellen Sie die letzte Sicherung wieder her und führen Sie das Transaktionsprotokoll bis zu dem Zeitpunkt aus, an dem Löschen / Abschneiden bevorsteht.
Die folgenden verwandten Informationen stammen aus einem Blog-Beitrag :
Während der Arbeit an der Datenbank verwenden wir Löschen und Abschneiden, ohne die Unterschiede zwischen ihnen zu kennen. In diesem Artikel werden wir den Unterschied zwischen Löschen und Abschneiden in SQL diskutieren.
Löschen:
- Löschen ist ein DML-Befehl.
- Die Delete-Anweisung wird mit einer Zeilensperre ausgeführt. Jede Zeile in der Tabelle wird zum Löschen gesperrt.
- Wir können Filter in der where-Klausel angeben.
- Es löscht die angegebenen Daten, wenn eine Bedingung vorliegt.
- Löschen Sie Aktivitäten als Auslöser, da die Operation einzeln protokolliert wird.
- Langsamer als Abschneiden, da Protokolle gespeichert werden
Kürzen
- Abschneiden ist ein DDL-Befehl.
- Tabelle abschneiden sperrt immer die Tabelle und die Seite, aber nicht jede Zeile. Da alle Daten entfernt werden.
- Kann Where-Bedingung nicht verwenden.
- Es entfernt alle Daten.
- Tabelle abschneiden kann keinen Trigger aktivieren, da der Vorgang keine einzelnen Zeilenlöschungen protokolliert.
- Schneller in Bezug auf die Leistung, da keine Protokolle geführt werden.
Hinweis: Löschen und Abschneiden können bei Verwendung mit Transaktion zurückgesetzt werden. Wenn die Transaktion abgeschlossen ist, bedeutet festgeschrieben, dass wir den Befehl "Abschneiden" nicht zurücksetzen können, aber dennoch den Befehl "Löschen" aus Protokolldateien zurücksetzen können, da das Löschen Schreibaufzeichnungen in der Protokolldatei aufzeichnet, falls ein zukünftiges Zurücksetzen aus Protokolldateien erforderlich ist.
Wenn Sie eine Fremdschlüsseleinschränkung haben, die sich auf die Tabelle bezieht, die Sie abschneiden möchten, funktioniert dies auch dann nicht, wenn die verweisende Tabelle keine Daten enthält. Dies liegt daran, dass die Fremdschlüsselprüfung nicht mit DML, sondern mit DDL durchgeführt wird. Dies kann umgangen werden, indem die Fremdschlüsseleinschränkung (en) für die Tabelle vorübergehend deaktiviert werden.
Tabelle löschen ist eine protokollierte Operation. Das Löschen jeder Zeile wird also im Transaktionsprotokoll protokolliert, was es langsam macht. Tabelle abschneiden löscht auch alle Zeilen in einer Tabelle, protokolliert jedoch nicht das Löschen jeder Zeile, sondern die Freigabe der Datenseiten der Tabelle, wodurch sie schneller wird.
~ Wenn Sie versehentlich alle Daten mit Löschen / Abschneiden aus der Tabelle entfernt haben. Sie können festgeschriebene Transaktionen zurücksetzen. Stellen Sie die letzte Sicherung wieder her und führen Sie das Transaktionsprotokoll bis zu dem Zeitpunkt aus, an dem Löschen / Abschneiden bevorsteht.
In SQL Server 2005 Ich glaube , dass Sie kann eine truncate Rollback
LÖSCHEN
Mit dem Befehl DELETE werden Zeilen aus einer Tabelle entfernt. Eine WHERE-Klausel kann verwendet werden, um nur einige Zeilen zu entfernen. Wenn keine WHERE-Bedingung angegeben ist, werden alle Zeilen entfernt. Nach dem Ausführen eines DELETE-Vorgangs müssen Sie die Transaktion COMMIT oder ROLLBACK ausführen, um die Änderung dauerhaft zu machen oder rückgängig zu machen. Beachten Sie, dass bei diesem Vorgang alle DELETE-Trigger auf dem Tisch ausgelöst werden.
KÜRZEN
TRUNCATE entfernt alle Zeilen aus einer Tabelle. Der Vorgang kann nicht zurückgesetzt werden und es werden keine Trigger ausgelöst. Daher ist TRUCATE schneller und benötigt nicht so viel Speicherplatz wie ein DELETE.
FALLEN
Der Befehl DROP entfernt eine Tabelle aus der Datenbank. Alle Zeilen, Indizes und Berechtigungen der Tabellen werden ebenfalls entfernt. Es werden keine DML-Trigger ausgelöst. Der Vorgang kann nicht zurückgesetzt werden.
DROP und TRUNCATE sind DDL-Befehle, während DELETE ein DML-Befehl ist. Daher können DELETE-Operationen zurückgesetzt (rückgängig gemacht) werden, während DROP- und TRUNCATE-Operationen nicht zurückgesetzt werden können.
Von: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
TRUNCATE kann zurückgesetzt werden, wenn es in eine Transaktion eingeschlossen ist.
Bitte beachten Sie die beiden folgenden Referenzen und testen Sie sich selbst: -
TRUNCATE vs. DELETE ist eine der berüchtigten Fragen bei SQL-Interviews. Stellen Sie einfach sicher, dass Sie es dem Interviewer richtig erklären, da es Sie sonst den Job kosten könnte. Das Problem ist, dass nicht viele wissen, dass sie die Antwort höchstwahrscheinlich als falsch betrachten, wenn Sie ihnen sagen, dass YES Truncate zurückgesetzt werden kann.
Eine kleine Korrektur der ursprünglichen Antwort - Löschen erzeugt auch erhebliche Mengen an Wiederherstellen (da das Rückgängigmachen selbst durch Wiederherstellen geschützt ist). Dies ist aus der Autotrace-Ausgabe ersichtlich:
SQL> delete from t1;
10918 rows deleted.
Elapsed: 00:00:00.58
Execution Plan
----------------------------------------------------------
0 DELETE STATEMENT Optimizer=FIRST_ROWS (Cost=43 Card=1)
1 0 DELETE OF 'T1'
2 1 TABLE ACCESS (FULL) OF 'T1' (TABLE) (Cost=43 Card=1)
Statistics
----------------------------------------------------------
30 recursive calls
12118 db block gets
213 consistent gets
142 physical reads
3975328 redo size
441 bytes sent via SQL*Net to client
537 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
10918 rows processed
Hier ist meine detaillierte Antwort zum Unterschied zwischen DELETE und TRUNCATE in SQL Server
• Daten entfernen : Als erstes können beide verwendet werden, um die Zeilen aus der Tabelle zu entfernen.
Ein DELETE kann jedoch verwendet werden, um die Zeilen nicht nur aus einer Tabelle, sondern auch aus einer VIEW oder dem Ergebnis eines OPENROWSET oder einer OPENQUERY zu entfernen, sofern die Anbieterfunktionen dies zulassen.
• FROM-Klausel : Mit DELETE können Sie auch Zeilen aus einer Tabelle / view / rowset_function_limited basierend auf Zeilen aus einer anderen Tabelle löschen, indem Sie eine andere FROM-Klausel verwenden. In dieser FROM-Klausel können Sie auch normale JOIN-Bedingungen schreiben. Tatsächlich können Sie eine DELETE-Anweisung aus einer SELECT-Anweisung erstellen, die keine Aggregatfunktionen enthält, indem Sie SELECT durch DELETE ersetzen und Spaltennamen entfernen.
Mit TRUNCATE geht das nicht.
• WO : Ein TRUNCATE kann keine WHERE-Bedingungen haben, ein DELETE jedoch. Das bedeutet, dass Sie mit TRUNCATE keine bestimmte Zeile oder bestimmte Gruppe von Zeilen löschen können. TRUNCATE TABLE ähnelt der DELETE-Anweisung ohne WHERE-Klausel.
• Leistung : TRUNCATE TABLE ist schneller und benötigt weniger System- und Transaktionsprotokollressourcen. Und einer der Gründe sind Sperren, die von beiden Anweisungen verwendet werden. Die DELETE-Anweisung wird mit einer Zeilensperre ausgeführt. Jede Zeile in der Tabelle wird zum Löschen gesperrt. TRUNCATE TABLE sperrt immer die Tabelle und die Seite, jedoch nicht jede Zeile.
• Transaktionsprotokoll : Die Anweisung DELETE entfernt die Zeilen einzeln und nimmt für jede Zeile einzelne Einträge im Transaktionsprotokoll vor.
TRUNCATE TABLE entfernt die Daten, indem die zum Speichern der Tabellendaten verwendeten Datenseiten freigegeben werden, und zeichnet nur die Seitenfreigaben im Transaktionsprotokoll auf.
• Seiten : Nachdem eine DELETE-Anweisung ausgeführt wurde, kann die Tabelle noch leere Seiten enthalten. TRUNCATE entfernt die Daten, indem die zum Speichern der Tabellendaten verwendeten Datenseiten freigegeben werden.
• Trigger : TRUNCATE aktiviert die Lösch-Trigger in der Tabelle nicht. Sie müssen also bei der Verwendung von TRUNCATE sehr vorsichtig sein. Man sollte niemals TRUNCATE verwenden, wenn in der Tabelle ein Löschauslöser definiert ist, um beim Löschen von Zeilen eine automatische Bereinigungs- oder Protokollierungsaktion durchzuführen.
• Identitätsspalte : Wenn die Tabelle mit TRUNCATE eine Identitätsspalte enthält, wird der Zähler für diese Spalte auf den für die Spalte definierten Startwert zurückgesetzt. Wenn kein Startwert definiert wurde, wird der Standardwert 1 verwendet. DELETE setzt den Identitätszähler nicht zurück. Wenn Sie also den Identitätszähler beibehalten möchten, verwenden Sie stattdessen DELETE.
• Replikation : DELETE kann für Tabellen verwendet werden, die für die Transaktionsreplikation oder die Zusammenführungsreplikation verwendet werden.
TRUNCATE kann zwar nicht für die Tabellen verwendet werden, die an der Transaktionsreplikation oder der Zusammenführungsreplikation beteiligt sind.
• Rollback : Die DELETE-Anweisung kann zurückgesetzt werden.
TRUNCATE kann auch zurückgesetzt werden, sofern es in einem TRANSACTION-Block eingeschlossen ist und die Sitzung nicht geschlossen wird. Sobald die Sitzung geschlossen ist, können Sie TRUNCATE nicht mehr zurücksetzen.
• Einschränkungen : Die DELETE-Anweisung kann fehlschlagen, wenn sie einen Trigger verletzt oder versucht, eine Zeile zu entfernen, auf die durch Daten in einer anderen Tabelle mit einer FOREIGN KEY-Einschränkung verwiesen wird. Wenn DELETE mehrere Zeilen entfernt und eine der entfernten Zeilen einen Auslöser oder eine Einschränkung verletzt, wird die Anweisung abgebrochen, ein Fehler zurückgegeben und keine Zeilen entfernt.
Wenn DELETE für View verwendet wird, muss diese View eine aktualisierbare Ansicht sein. TRUNCATE kann nicht für die in der indizierten Ansicht verwendete Tabelle verwendet werden.
TRUNCATE kann nicht für die Tabelle verwendet werden, auf die durch eine FOREIGN KEY-Einschränkung verwiesen wird, es sei denn, eine Tabelle mit einem Fremdschlüssel, der auf sich selbst verweist.
DECLARE @ai as bigint
SET @ai =IDENT_CURRENT('tablename')
TRUNCATE TABLE tablename
DBCC checkident('tablename', RESEED, @ai)
Der größte Unterschied besteht darin, dass das Abschneiden nicht protokolliert wird, während das Löschen erfolgt.
Dies bedeutet einfach, dass Sie im Falle eines Datenbankabsturzes die durch Abschneiden bearbeiteten Daten nicht wiederherstellen können, aber mit Löschen können Sie dies.
Weitere Details hier
DELETE-Anweisung: Dieser Befehl löscht nur die Zeilen aus der Tabelle basierend auf der in der where-Klausel angegebenen Bedingung oder löscht alle Zeilen aus der Tabelle, wenn keine Bedingung angegeben ist. Der Speicherplatz für die Tabelle wird jedoch nicht freigegeben.
Die Syntax einer SQL DELETE-Anweisung lautet:
DELETE FROM table_name [WHERE-Bedingung];
TRUNCATE-Anweisung: Mit diesem Befehl werden alle Zeilen aus der Tabelle gelöscht und der Speicherplatz für die Tabelle freigegeben.
LÖSCHEN
DELETE is a DML command DELETE you can rollback Delete = Only Delete- so it can be rolled back In DELETE you can write conditions using WHERE clause Syntax – Delete from [Table] where [Condition]
KÜRZEN
TRUNCATE is a DDL command You can't rollback in TRUNCATE, TRUNCATE removes the record permanently Truncate = Delete+Commit -so we can't roll back You can't use conditions(WHERE clause) in TRUNCATE Syntax – Truncate table [Table]
Weitere Details finden Sie unter
http://www.zilckh.com/what-is-the-difference-between-truncate-and-delete/
Kurz gesagt, das Abschneiden protokolliert nichts (ist also viel schneller, kann aber nicht rückgängig gemacht werden), während das Löschen protokolliert wird (und Teil einer größeren Transaktion sein kann, ein Rollback durchführt usw.). Wenn Sie Daten haben, die Sie nicht in einer Tabelle in dev haben möchten, ist es normalerweise besser, sie abzuschneiden, da Sie nicht das Risiko eingehen, das Transaktionsprotokoll zu füllen
Ein wichtiger Grund dafür ist, dass Sie die Daten in einer Tabelle mit mehreren Millionen Zeilen aktualisieren müssen, sie aber nicht neu erstellen möchten. "Löschen *" würde ewig dauern, während die Auswirkungen von Truncate auf die Leistung vernachlässigbar wären.
DDL kann nicht über einen Dblink ausgeführt werden.
Es ist nicht so, dass das Abschneiden in SQL Server nichts protokolliert. truncate protokolliert keine Informationen, protokolliert jedoch die Freigabe der Datenseite für die Tabelle, für die Sie TRUNCATE ausgelöst haben.
und abgeschnittener Datensatz kann ein Rollback sein, wenn wir die Transaktion zu Beginn definieren, und wir können den abgeschnittenen Datensatz nach dem Rollback wiederherstellen. Es können jedoch keine abgeschnittenen Datensätze aus der Transaktionsprotokollsicherung nach einer festgeschriebenen abgeschnittenen Transaktion wiederhergestellt werden.
Abschneiden kann hier auch das Beispiel zurückgesetzt werden
begin Tran
delete from Employee
select * from Employee
Rollback
select * from Employee
Abschneiden und Löschen in SQL sind zwei Befehle, mit denen Daten aus der Tabelle entfernt oder gelöscht werden. Obwohl beide SQL-Befehle von Natur aus recht einfach sind, können sie viele Probleme verursachen, bis Sie mit den Details vertraut sind, bevor Sie sie verwenden. Eine falsche Befehlswahl kann entweder zu einem sehr langsamen Prozess führen oder sogar das Protokollsegment in die Luft jagen, wenn zu viele Daten entfernt werden müssen und das Protokollsegment nicht ausreicht. Aus diesem Grund ist es wichtig zu wissen, wann der Befehl zum Abschneiden und Löschen in SQL verwendet werden muss. Bevor Sie diese verwenden, sollten Sie sich jedoch der Unterschiede zwischen Abschneiden und Löschen bewusst sein. Auf der Grundlage dieser Befehle sollten wir herausfinden können, wann DELETE die bessere Option zum Entfernen ist data oder TRUNCATE sollten zum Löschen von Tabellen verwendet werden.
Siehe Check hier klicken
Ein weiterer Unterschied, der für Microsoft SQL Server spezifisch ist, besteht darin, dass delete
Sie mithilfe der output
Anweisung verfolgen können, welche Datensätze gelöscht wurden, z.
delete from [SomeTable]
output deleted.Id, deleted.Name
Sie können dies nicht mit tun truncate
.