it-swarm.com.de

Was ist der Unterschied zwischen TRUNCATE und DELETE in SQL?

Ich habe eine Antwort auf diese Frage aus Versehen als Antwort auf eine Frage nach dem Unterschied zwischen DROP und TRUNCATE verfasst, aber ich dachte, dass es eine Schande ist, nicht zu teilen, deshalb werde ich meine eigene Antwort auf meine eigene Frage posten ... ist das sogar ethisch? :)

Bearbeiten: Wenn Ihre Antwort plattformspezifisch ist, können Sie das bitte angeben.

217
David Aldridge

Hier ist eine Liste der Unterschiede. Ich habe Oracle-spezifische Funktionen hervorgehoben, und hoffentlich kann die Community auch den Unterschied anderer Anbieter hinzufügen. Unterschiede, die bei den meisten Anbietern üblich sind, können direkt unter den Überschriften gehen, wobei die Unterschiede unten hervorgehoben werden.


Gesamtübersicht

Wenn Sie alle Zeilen schnell 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 Aspekte müssen berücksichtigt werden, wie im Folgenden beschrieben.


Anweisungstyp

Löschen ist DML, Truncate ist DDL


Commit und Rollback

Variabel nach Anbieter

SQL Server

Abschneiden kann zurückgesetzt werden.

PostgreSQL

Abschneiden kann zurückgesetzt werden.

Oracle

Da ein TRUNCATE DDL ist, sind zwei Commits vor und nach der Ausführung der Anweisung erforderlich. Abschneiden kann daher nicht rückgängig gemacht werden, und ein Fehler im abgeschnittenen Prozess hat ohnehin ein Commit ausgelöst.

Siehe jedoch Flashback weiter unten.


Weltraumgewinnung

Löschen stellt keinen Speicherplatz wieder her, Truncate stellt Speicherplatz wieder her

Oracle

Wenn Sie die Klausel REUSE STORAGE verwenden, werden die Datensegmente nicht freigegeben. Dies kann geringfügig effizienter sein, wenn die Tabelle mit Daten erneut geladen werden soll. Die Hochwassermarke wird zurückgesetzt.


Zeilenumfang

Löschen kann zum Entfernen aller Zeilen oder nur einer Teilmenge von Zeilen verwendet werden. Abschneiden entfernt alle Zeilen.

Oracle

Wenn eine Tabelle partitioniert ist, können die einzelnen Partitionen isoliert abgeschnitten werden, sodass eine teilweise Entfernung aller Tabellendaten möglich ist.


Objekttypen

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)


Datenobjektidentität

Oracle

Das Löschen wirkt sich nicht auf die Datenobjekt-ID aus. Abschneiden weist jedoch eine neue Datenobjekt-ID zu. Sofern nicht Die Tabelle hat seit ihrer Erstellung noch nie eine Einfügung vorgenommen. Selbst eine einzelne zurückgesetzte Einfügung führt zu einem neuen Datenobjekt id, die beim Abschneiden zugewiesen werden soll.


Flashback (Oracle)

Flashback funktioniert über alle Löschvorgänge hinweg, ein Abschneiden verhindert jedoch, dass der Status vor der Operation zurückgesetzt wird.

Ab 11gR2 erlaubt dies die FLASHBACK ARCHIVE-Funktion, außer in der Express Edition

Verwendung von FLASHBACK in Oraclehttp://docs.Oracle.com/cd/E11882_01/appdev.112/e41502/adfns_flashback.htm#ADFNS638


Privilegien

Variable

Oracle

Das Löschen kann für eine Tabelle für einen anderen Benutzer oder eine andere Rolle erteilt werden, das Abschneiden kann jedoch nicht ohne die DROP ANY TABLE-Zuweisung erfolgen.


Wiederholen rückgängig

Löschen erzeugt eine kleine Anzahl von Wiederholungen und eine große Menge von Rückgängig. Abschneiden erzeugt jeweils eine vernachlässigbare Menge.


Indizes

Oracle

Ein abgeschnittener Vorgang macht unbrauchbare Indizes wieder verwendbar. Löschen geht nicht.


Fremde Schlüssel

Eine Kürzung 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.


Tischverriegelung

Oracle

Das Abschneiden erfordert eine exklusive Tabellensperre, das Löschen eine gemeinsame Tabellensperre. Durch das Deaktivieren von Tabellensperren können Sie das Abschneiden von Operationen in einer Tabelle verhindern.


Löst aus

DML-Trigger werden nicht bei einem Abschneiden ausgelöst.

Oracle

DDL-Trigger sind verfügbar.


Remote-Ausführung

Oracle

Abschneiden kann nicht über eine Datenbankverknüpfung ausgegeben werden.


Identitätsspalten

SQL Server

Abschneiden setzt die Reihenfolge für IDENTITY-Spaltentypen zurück, Löschen nicht.


Ergebnis gesetzt

In den meisten Implementierungen kann eine DELETE-Anweisung die gelöschten Zeilen an den Client zurückgeben.

z.B. 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;
217
David Aldridge

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)              |
+----------------------------------------+----------------------------------------------+
144
Bhaumik Patel

DROP

Der Befehl DROP entfernt eine Tabelle aus der Datenbank. Alle Zeilen, Indizes und Privilegien 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 rückgängig gemacht werden und es werden keine Trigger ausgelöst. Daher ist TRUCATE schneller und beansprucht weniger Speicherplatz als DELETE.

LÖSCHEN

Mit dem Befehl DELETE werden Zeilen aus einer Tabelle entfernt. Mit einer WHERE-Klausel können nur einige Zeilen entfernt werden. Wenn keine WHERE-Bedingung angegeben ist, werden alle Zeilen entfernt. Nach einer DELETE-Operation müssen Sie die Transaktion mit COMMIT oder ROLLBACK bestätigen, um die Änderung dauerhaft zu machen oder sie rückgängig zu machen. Beachten Sie, dass bei diesem Vorgang alle DELETE-Trigger auf dem Tisch ausgelöst werden.

Von: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands

29
Mohit Singh

Alle guten Antworten, die ich hinzufügen muss:

Da TRUNCATE TABLE eine DDL ( Data Defination Language ) und kein DML ( Data Manipulation Langauge ) Befehl ist, werden Delete Triggers nicht ausgeführt.

22
polara

Wenn bei SQL Server oder MySQL ein PK mit automatischem Inkrement vorhanden ist, wird der Zähler durch Abschneiden zurückgesetzt.

15
mathieu

Zusammenfassung von Delete Vs Truncate in SQL Server
Für den vollständigen Artikel folgen Sie diesem Link: http://codaffection.com/sql-server-article/delete-vs-truncate-in-sql-server/

 enter image description here

Aus dem Dotnet-Mob-Artikel entnommen: Vs Truncate in SQL Server löschen

14
Shamseer K

"Abschneiden protokolliert nichts" ist korrekt. Ich würde noch 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 variiert je nach Situation von trivial bis hin zu enorm.

Ich habe jedoch gesehen, dass das unbeabsichtigte Abschneiden der referentiellen Integrität und andere Einschränkungen verletzt wurde. Die Leistung, die Sie durch das Modifizieren von Daten außerhalb einer Transaktion erhalten, muss gegen die Verantwortung abgeglichen werden, die Sie erben, wenn Sie ohne Netzwerk über das Hochseil gehen.

11
Walter Mitty

Ja, DELETE ist langsamer, TRUNCATE ist schneller. Warum? 

DELETE muss die Datensätze lesen, Einschränkungen prüfen, den Block aktualisieren, Indizes aktualisieren und Wiederherstellen/Rückgängigmachen erzeugen. All das braucht Zeit.

TRUNCATE passt einfach einen Zeiger in der Datenbank für die Tabelle (das High Water Mark) und den Poof an! Die Daten sind weg. 

Dies ist Oracle-spezifisch, AFAIK.

6
DCookie

TRUNCATE ist die DDL-Anweisung, während DELETE eine DML-Anweisung ist. Im Folgenden sind die Unterschiede zwischen den beiden: 

  1. Da TRUNCATE eine DDL-Anweisung ( Data definition language ) ist, 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. Andererseits ist DELETE eine DML-Anweisung ( Data manipulation language ) und erfordert daher ein explizites Commit, um ihre Wirkung dauerhaft zu machen.

  2. TRUNCATE entfernt immer alle Zeilen aus einer Tabelle, wobei die Tabelle leer bleibt und die Tabellenstruktur intakt bleibt, wohingegen DELETE unter Umständen bedingt entfernt werden kann, wenn die where-Klausel verwendet wird.

  3. Die mit der TRUNCATE TABLE-Anweisung gelöschten Zeilen können nicht wiederhergestellt werden, und Sie können die where-Klausel in der TRUNCATE-Anweisung nicht angeben.

  4. TRUNCATE-Anweisungen lösen keine Trigger aus, im Gegensatz zu on delete-Trigger bei DELETE-Anweisungen

Hier ist der sehr gute Link zum Thema relevant.

5

Wenn Sie versehentlich alle Daten mit Delete/Truncate aus der Tabelle entfernt haben. Sie können die festgeschriebene Transaktion rückgängig machen. Stellen Sie die letzte Sicherung wieder her, und führen Sie das Transaktionslog bis zu dem Zeitpunkt aus, an dem Delete/Truncate ausgeführt wird.

Die folgenden Informationen stammen aus einem Blogbeitrag :

Während der Arbeit an der Datenbank verwenden wir Delete und Truncate ohne die Unterschiede zwischen ihnen kennen. In diesem Artikel werden wir besprechen. der Unterschied zwischen Löschen und Abschneiden in SQL.

Löschen:

  • Löschen ist ein DML-Befehl.
  • Die Löschanweisung wird mit einer Zeilensperre ausgeführt. Jede Zeile in der Tabelle wird zum Löschen gesperrt.
  • Wir können Filter in where-Klausel angeben.
  • Es löscht angegebene Daten, wenn eine Bedingung vorhanden ist.
  • Löschen Sie Aktivitäten als Auslöser, da die Vorgänge einzeln protokolliert werden.
  • Langsamer als Abschneiden, da Protokolle aufbewahrt werden

Kürzen

  • Abschneiden ist ein DDL-Befehl.
  • Tabelle abschneiden sperrt immer die Tabelle und die Seite, jedoch nicht jede Zeile. Da alle Daten entfernt werden.
  • Die Where-Bedingung kann nicht verwendet werden. 
  • Es entfernt alle Daten.
  • Die Abschneidetabelle kann keinen Trigger aktivieren, da der Vorgang keine einzelnen Zeilenlöschungen protokolliert.
  • In Bezug auf die Leistung schneller, da keine Protokolle geführt werden.

Hinweis: Löschen und Abschneiden können bei Verwendung von .__ zurückgesetzt werden. Transaktion. Wenn die Transaktion abgeschlossen ist, bedeutet, dass sie nicht festgelegt werden kann. rollback Befehl wird abgeschnitten, der Befehl Löschen kann jedoch noch zurückgesetzt werden aus Protokolldateien, wenn delete write sie in der Protokolldatei aufzeichnet, falls es .__ ist. Rollback in der Zukunft aus Protokolldateien erforderlich.

Wenn Sie eine Fremdschlüsseleinschränkung haben, die sich auf die Tabelle bezieht, sind Sie Beim Abschneiden versucht dies nicht, auch wenn die verweisende Tabelle kein .__ hat. Daten darin. Dies liegt daran, dass die Fremdschlüsselprüfung mit DDL .__ erfolgt. anstatt DML. Dies kann umgangen werden, indem Sie .__ vorübergehend deaktivieren. Fremdschlüsseleinschränkung (en) an die Tabelle.

Tabelle löschen ist eine protokollierte Operation. Das Löschen jeder Zeile erhält also im Transaktionslog protokolliert, was es langsam macht. Tabelle abschneiden löscht auch alle Zeilen in einer Tabelle, protokolliert jedoch nicht das Löschen von stattdessen protokolliert jede Zeile die Freigabe der Datenseiten der Tisch, der es schneller macht.

~ Wenn Sie versehentlich alle Daten mit .__ aus der Tabelle entfernt haben. Löschen/abschneiden Sie können die festgeschriebene Transaktion rückgängig machen. Stellen Sie die .__ wieder her. letzte Sicherung und führen Sie das Transaktionslog bis zu dem Zeitpunkt aus, an dem Delete/Truncate wird bald geschehen.

5
wpzone4u

In SQL Server 2005 glaube ich, dass Sie ein abgeschnittenes können rollback

3
Xander

LÖSCHEN

Mit dem Befehl DELETE werden Zeilen aus einer Tabelle entfernt. Mit einer WHERE-Klausel können nur einige Zeilen entfernt werden. Wenn keine WHERE-Bedingung angegeben ist, werden alle Zeilen entfernt. Nach einer DELETE-Operation müssen Sie die Transaktion mit COMMIT oder ROLLBACK bestätigen, um die Änderung dauerhaft zu machen oder sie 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 rückgängig gemacht werden und es werden keine Trigger ausgelöst. Daher ist TRUCATE schneller und beansprucht weniger Speicherplatz als DELETE.

DROP

Der Befehl DROP entfernt eine Tabelle aus der Datenbank. Alle Zeilen, Indizes und Privilegien 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-Vorgänge rückgängig gemacht werden, während DROP- und TRUNCATE-Vorgänge nicht rückgängig gemacht werden können.

Von: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands

3
MyUserQuestion

TRUNCATE kann zurückgesetzt werden, wenn es in einer Transaktion eingeschlossen ist. 

Bitte sehen Sie sich die zwei Referenzen unten an und testen Sie sich selbst: -

http://blog.sqlauthority.com/2007/12/26/sql-server-truncate-cant-be-rolled-back-using-log-files-after-transaction-session-is-closed/

http://sqlblog.com/blogs/kalen_delaney/archive/2010/10/12/tsql-tuesday-11-rolling-back-truncate-table.aspx

TRUNCATE vs. DELETE ist eine der berüchtigten Fragen bei SQL-Interviews. Stellen Sie einfach sicher, dass Sie es dem Interviewer richtig erklären, oder es könnte Ihnen den Job kosten. Das Problem ist, dass nicht viele davon wissen, dass die Antwort höchstwahrscheinlich falsch ist, wenn Sie ihnen sagen, dass YES Truncate rückgängig gemacht werden kann.

2
SQLnbe

Eine kleine Korrektur der ursprünglichen Antwort - Löschen führt auch zu erheblichen Wiederholungen (da Rückgängigmachen selbst durch Wiederholen geschützt wird). 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
2
CaptainPicard

Ein weiterer Unterschied der beiden Operationen besteht darin, dass, wenn die Tabelle eine Identitätsspalte enthält, der Zähler für diese Spalte unter TRUNCATE auf 1 (oder den für die Spalte definierten Startwert) zurückgesetzt wird. DELETE hat diesen Effekt nicht.

1
westyside

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]

ABSCHNEIDEN

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]

Für weitere Informationen besuchen Sie bitte

http://www.zilckh.com/what-is-the-difference-zum-truncate-and-delete/

1
user27332

Der größte Unterschied ist, dass das Abschneiden nicht protokolliert wird, während gelöscht wird.

Es bedeutet einfach, dass Sie im Falle eines Datenbankabsturzes die Daten nicht wiederherstellen können, für die Kürzungen vorgenommen wurden. Mit Delete können Sie dies jedoch tun. 

Weitere Details hier

1
Learning

Hier ist meine ausführliche Antwort auf den Unterschied zwischen DELETE und TRUNCATE in SQL Server

Remove Data: Zuerst 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 zu entfernen, sondern auch aus einer VIEW oder dem Ergebnis eines OPENROWSET oder OPENQUERY, abhängig von den Providerfähigkeiten. 

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. Sie können tatsächlich eine DELETE-Anweisung aus einer SELECT-Anweisung erstellen, die keine Aggregatfunktionen enthält, indem Sie SELECT durch DELETE ersetzen und Spaltennamen entfernen.
Mit TRUNCATE ist das nicht möglich. 

WHERE: Ein TRUNCATE kann keine WHERE-Bedingungen haben, ein DELETE kann jedoch. Das bedeutet, dass Sie mit TRUNCATE keine bestimmte Zeile oder Gruppe von Zeilen löschen können. TRUNCATE TABLE ähnelt der DELETE-Anweisung ohne WHERE-Klausel.

Performance: TRUNCATE TABLE ist schneller und benötigt weniger System- und Transaktionsprotokollressourcen. 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 ist zum Löschen gesperrt. TRUNCATE TABLE sperrt immer die Tabelle und die Seite, nicht jedoch jede Zeile.

Transaction log: Die DELETE-Anweisung entfernt Zeilen einzeln und nimmt für jede Zeile einzelne Einträge im Transaktionslog vor.
TRUNCATE TABLE entfernt die Daten durch Aufheben der Zuordnung der zum Speichern der Tabellendaten verwendeten Datenseiten und zeichnet nur die Seitenaufhebungen im Transaktionsprotokoll auf.

Pages: Nachdem eine DELETE-Anweisung ausgeführt wurde, kann die Tabelle noch leere Seiten enthalten. TRUNCATE entfernt die Daten durch Aufheben der Zuordnung der Datenseiten, die zum Speichern der Tabellendaten verwendet werden.

Trigger: TRUNCATE aktiviert die Lösch-Trigger für die Tabelle nicht. Sie müssen also bei der Verwendung von TRUNCATE sehr vorsichtig sein. Ein TRUNCATE sollte niemals verwendet werden, wenn der Löschauslöser für die Tabelle definiert ist, um eine automatische Bereinigungs- oder Protokollierungsaktion auszuführen, wenn Zeilen gelöscht werden.

Identity Column: Wenn TRUNCATE in der Tabelle 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 den Identitätszähler beibehalten möchten, verwenden Sie stattdessen DELETE.

Replication: DELETE kann für Tabellen verwendet werden, die bei der Transaktionsreplikation oder Mergereplikation verwendet werden.
TRUNCATE kann nicht für die Tabellen verwendet werden, die an der Transaktionsreplikation oder der Mergereplikation beteiligt sind. 

Rollback: Die DELETE-Anweisung kann zurückgesetzt werden.
TRUNCATE kann auch zurückgesetzt werden, vorausgesetzt, er ist in einem TRANSACTION-Block eingeschlossen und die Sitzung wird nicht geschlossen. Sobald die Sitzung geschlossen ist, können Sie TRUNCATE nicht zurücksetzen.

Restrictions: Die DELETE-Anweisung schlägt möglicherweise fehl, wenn sie einen Trigger verletzt oder versucht, eine Zeile zu entfernen, auf die Daten in einer anderen Tabelle mit einer FOREIGN KEY-Einschränkung verweisen. 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.
.__ Und 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.

1
Mangal Pardeshi

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. Es gibt jedoch nicht den Platz frei, der die Tabelle enthält.

Die Syntax einer SQL DELETE-Anweisung lautet:

DELETE FROM Tabellenname [WHERE-Bedingung];

TRUNCATE-Anweisung: Mit diesem Befehl werden alle Zeilen aus der Tabelle gelöscht und der Speicherplatz freigegeben, der die Tabelle enthält.

1
Bhushan Patil

Abschneiden und Löschen in SQL sind zwei Befehle, mit denen Daten aus der Tabelle entfernt oder gelöscht werden. Obwohl sie in der Natur recht einfach sind, können beide SQL-Befehle viele Probleme verursachen, bis Sie mit den Details vertraut sind, bevor Sie sie verwenden. Eine falsche Auswahl des Befehls kann entweder zu einem sehr langsamen Prozess führen oder sogar das Protokollsegment sprengen, wenn zu viele Daten vorhanden sind muss entfernt werden und das Protokollsegment reicht nicht aus. Aus diesem Grund ist es wichtig zu wissen, wann der Befehl zum Abschneiden und Löschen in SQL verwendet wird. Bevor Sie diesen Befehl verwenden, sollten Sie jedoch die Unterschiede zwischen Abschneiden und Löschen kennen. Auf dieser Grundlage sollten wir herausfinden können, wann DELETE die bessere Option zum Entfernen ist Daten oder TRUNCATE sollten zum Löschen von Tabellen verwendet werden.

Verweis prüfen hier klicken

0
wpzone4u

Es ist nicht so, dass abgeschnitten nichts in SQL Server protokolliert. truncate protokolliert keine Informationen, protokolliert jedoch die Freigabe der Datenseite für die Tabelle, in der Sie TRUNCATE ausgelöst haben.

und der abgeschnittene Datensatz kann ein Rollback sein, wenn wir die Transaktion zu Beginn definieren und den abgeschnittenen Datensatz nach dem Rollback wiederherstellen können. Kann jedoch keine abgeschnittenen Datensätze aus der Transaktionsprotokollsicherung nach einer festgeschriebenen abgeschnittenen Transaktion wiederherstellen.

0
user2587360

Ein wichtiger Grund ist, dass es praktisch ist, wenn Sie die Daten in einer Multi-Millionen-Zeilentabelle aktualisieren müssen, sie jedoch nicht neu erstellen möchten. "Löschen *" würde für immer dauern, während die Auswirkung von Truncate auf die Performance zu vernachlässigen wäre.

0
Jordan Ogren

Truncate Der Befehl wird zum erneuten Initialisieren der Tabelle verwendet. Hierbei handelt es sich um einen DDL-Befehl, mit dem alle Zeilen der Tabelle gelöscht werden. Der Bereich DELETE ist ein DML-Befehl, der zum Löschen der Zeile verwendet wird Wenn eine Bedingung nicht angegeben ist, werden mit diesem Befehl alle Zeilen aus der Tabelle gelöscht. 

0
Rishish

Ich würde den Beitrag von matthieu kommentieren, aber ich habe noch keine Vertretung ...

In MySQL wird der Zähler für die automatische Inkrementierung mit Abschneiden zurückgesetzt, nicht jedoch mit Löschen.

0
nathan

Mit der Anweisung TRUNCATE TABLE weisen Sie SQL Server an, alle Datensätze in einer Tabelle zu löschen, ohne dass Protokollierung oder Transaktionsverarbeitung stattfindet.

0
Gerald

Ein weiterer Unterschied, der für den Microsoft SQL-Server spezifisch ist, ist mit delete. Sie können die output-Anweisung verwenden, um zu verfolgen, welche Datensätze gelöscht wurden, z.

delete from [SomeTable]
output deleted.Id, deleted.Name

Mit truncate ist das nicht möglich.

Löschen Löschen entfernt nur die Daten, die Tabellenstruktur bleibt erhalten.

Dies ist ein DML-Anweisungs-Rollback möglich. Es wird weder vorher noch nachher ein Commit durchgeführt. (Da es sich um eine DML-Anweisung handelt). Sie nehmen Sperren für Zeilen auf. Sie generieren Redo (viele davon). Sie benötigen Segmente im UNDO-Tablespace. Ein Löschvorgang gibt keinen Segmentbereich frei, daher behält eine Tabelle, in der alle Datensätze gelöscht wurden, alle ursprünglichen Blöcke bei. Beim Abschneiden wird die High Water Mark des Tisches nicht auf Null zurückgesetzt, sondern die ursprüngliche Position beibehalten. Löschen löscht die spezifischen Zeilen, die nach der where-Anweisung gefiltert wurden. und log wird dafür gepflegt. Es kann die Trigger aktivieren. Abschneiden Abschneiden entfernt nur die Daten, die Tabellenstruktur bleibt erhalten. Dies ist ein DDL-Anweisungs-Rollback nicht möglich (außer in SQL 2005). Es wird ein COMMIT ausgegeben, bevor es ausgeführt wird, und anschließend ein weiteres COMMIT, sodass kein Rollback der Transaktion möglich ist. (Da es sich um eine DDL-Anweisung handelt) Es werden keine Sperren auf Zeilenebene verwendet. Es wird kein Redo oder Rollback generiert. Sie benötigen keine Segmente im UNDO-Tablespace. Alle Bereiche bis auf den Anfangsbuchstaben werden aus der Tabelle entfernt. Ein Abschneiden verschiebt die High Water Mark der Tabelle zurück auf Null. Abschneiden löscht die mit der Tabelle verknüpfte Seite, sodass alle Indizes zurückgesetzt werden. Die Trigger werden nicht aktiviert. Drop Drop entfernt permanent sowohl die Daten als auch die Tabellenstruktur. Dies ist ein DDL-Anweisungs-Rollback nicht möglich. Es wird ein COMMIT ausgegeben, bevor es ausgeführt wird, und anschließend ein weiteres COMMIT, sodass kein Rollback der Transaktion möglich ist. (Da es sich um eine DDL-Anweisung handelt) Es werden keine Sperren auf Zeilenebene verwendet. Es wird kein Redo oder Rollback generiert. Sie benötigen keine Segmente im UNDO-Tablespace. Alle Bereiche bis auf den Anfangsbuchstaben werden aus der Tabelle entfernt. Ein Abschneiden verschiebt die High Water Mark der Tabelle zurück auf Null. Abschneiden löscht die mit der Tabelle verknüpfte Seite, sodass alle Indizes zurückgesetzt werden. Die Trigger werden nicht aktiviert.

0

Kurz gesagt, das Protokollieren 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, Rollback 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 haben, das Transaktionsprotokoll aufzufüllen

0
Oskar

DDL kann nicht über einen Dblink ausgeführt werden.

0
joel garry

Abschneiden kann hier auch im Beispiel rückgängig gemacht werden

begin Tran
delete from  Employee

select * from Employee
Rollback
select * from Employee
0
Vinay Pandit

Die DELETE-Anweisung kann eine WHERE-Klausel enthalten, um bestimmte Datensätze zu löschen, während die TRUNCATE-Anweisung keine Tabelle benötigt und die gesamte Tabelle löscht. Die DELETE-Anweisung protokolliert das gelöschte Datum, die TRUNCATE-Anweisung jedoch nicht.

0
Ali