Jaka jest różnica między TRUNCATE i DELETE w SQL


303

Jaka jest różnica między SQL TRUNCATEa DELETESQL?

Jeśli twoja odpowiedź dotyczy konkretnej platformy, proszę to zaznaczyć.


4
Wszystkie odpowiedzi są specyficzne dla platformy. W standardowym języku SQL nie ma polecenia TRUNCATE. Jest to zatem funkcja zastrzeżona i oznacza inną rzecz dla każdego dostawcy DBMS.
nvogel

Odpowiedź jest bardzo specyficzna dla implementacji, tak jak musi być, ponieważ jak wskazał sqlvogel, jest to niestandardowe polecenie (TRUNCATE). Pozostaw to oznaczone jako „wyrocznia” lub zróbmy z tego odpowiedź w stylu wiki społeczności i wprowadź konsekwencje dla każdego głównego RDBMS (wszystkie Oracle, MS-MSQL, PostgreSQL implementują TRUNCATE ...)
reedstrm

Jeśli transakcja jest zakończona, oznacza ZWOLNIONE, to nie możemy wycofać polecenia TRUNCATE, ale nadal możemy cofnąć polecenie DELETE z plików LOG, ponieważ DELETE zapisuje je w pliku dziennika na wypadek, gdyby w przyszłości konieczne było wycofanie z plików LOG.

Odpowiedzi:


272

Oto lista różnic. Podkreśliłem funkcje specyficzne dla Oracle i mam nadzieję, że społeczność może dodać specyficzną różnicę innych dostawców. Różnice, które są wspólne dla większości dostawców, mogą spaść bezpośrednio pod nagłówki, a różnice zaznaczono poniżej.


Przegląd ogólny

Jeśli chcesz szybko usunąć wszystkie wiersze z tabeli i naprawdę jesteś pewien, że chcesz to zrobić, i nie masz obcych kluczy do tabel, to TRUNCATE prawdopodobnie będzie szybsze niż DELETE .

Należy wziąć pod uwagę różne problemy specyficzne dla systemu, jak wyszczególniono poniżej.


Rodzaj wyciągu

Usuń to DML, obcięcie to DDL ( co to jest DDL i DML? )


Zatwierdź i wycofaj

Zmienna według dostawcy

Serwer SQL *

Obcinanie można wycofać.

PostgreSQL

Obcinanie można wycofać.

Wyrocznia

Ponieważ TRUNCATE jest DDL, wymaga dwóch zatwierdzeń, jednego przed wykonaniem instrukcji i jednego po nim. Obcięcia nie można zatem wycofać, a błąd w procesie obcinania i tak wyda zatwierdzenie.

Zobacz jednak Flashback poniżej.


Rekultywacja przestrzeni kosmicznej

Usuń nie odzyskuje miejsca, Truncate odzyskuje miejsce

Wyrocznia

Jeśli użyjesz klauzuli REUSE STORAGE, segmenty danych nie zostaną anulowane, co może być nieznacznie bardziej wydajne, jeśli tabela zostanie ponownie załadowana danymi. Znak wysokiej wody został zresetowany.


Zakres wiersza

Usuń można użyć do usunięcia wszystkich wierszy lub tylko podzbioru wierszy. Obetnij usuwa wszystkie wiersze.

Wyrocznia

Gdy tabela jest podzielona na partycje, poszczególne partycje mogą zostać obcięte osobno, dzięki czemu możliwe jest częściowe usunięcie wszystkich danych tabeli.


Typy obiektów

Usuń można zastosować do tabel i tabel wewnątrz klastra. Obcięcie dotyczy tylko tabel lub całego klastra. (Może być specyficzny dla Oracle)


Tożsamość obiektu danych

Wyrocznia

Usunięcie nie wpływa na identyfikator obiektu danych, ale obcięcie przypisuje nowy identyfikator obiektu danych, chyba że od czasu jego utworzenia nigdy nie istniała wstawka do tabeli. Nawet pojedyncza wycofana wstawka spowoduje przypisanie nowego identyfikatora obiektu danych po obcięciu .


Flashback (Oracle)

Retrospekcja działa w przypadku usuwania, ale obcięcie zapobiega retrospekcji do stanów sprzed operacji.

Jednak od 11gR2 funkcja ARCHIWUM FLASHBACK pozwala na to, z wyjątkiem wersji Express Edition

Wykorzystanie FLASHBACK w Oracle http://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_flashback.htm#ADFNS638


Uprawnienia

Zmienna

Wyrocznia

Usunięcie może zostać przyznane w tabeli innemu użytkownikowi lub roli, ale obcinanie nie może odbywać się bez użycia uprawnienia DROP ANY TABLE.


Ponów / Cofnij

Usuń powoduje wygenerowanie niewielkiej liczby powtórzeń i dużej liczby cofnięć. Obcięcie generuje znikomą liczbę każdego z nich.


Indeksy

Wyrocznia

Operacja obcięcia sprawia, że ​​indeksy bezużyteczne są ponownie użyteczne. Usuń nie.


Klucz obcy

Obcięcia nie można zastosować, gdy włączony klucz obcy odwołuje się do tabeli. Leczenie za pomocą delete zależy od konfiguracji kluczy obcych.


Blokowanie stołu

Wyrocznia

Obcięcie wymaga wyłącznej blokady tabeli, usuwanie wymaga udostępnionej blokady tabeli. Dlatego wyłączenie blokad stołu jest sposobem na zapobieganie obcinaniu operacji na stole.


Wyzwalacze

Wyzwalacze DML nie uruchamiają się po obcięciu.

Wyrocznia

Dostępne są wyzwalacze DDL.


Zdalne wykonanie

Wyrocznia

Obcięcia nie można wydać przez łącze do bazy danych.


Kolumny tożsamości

Serwer SQL *

Obcięcie resetuje sekwencję dla typów kolumn TOŻSAMOŚĆ, usuwanie nie.


Zestaw wyników

W większości implementacji DELETEinstrukcja może zwrócić klientowi usunięte wiersze.

np. w podprogramie Oracle PL / SQL można:

DELETE FROM employees_temp
WHERE       employee_id = 299 
RETURNING   first_name,
            last_name
INTO        emp_first_name,
            emp_last_name;

Nie rozumiem twojego czwartego stwierdzenia: jeśli powiem DELETE [ ] FROM Table; następnie * wszystkie wiersze w tej tabeli zostaną usunięte, chyba że FK je zatrzyma. Nawiasem mówiąc, myślę, że jest to specyficzne dla SQL Servera, nie można użyć TRUNCATE na tabelach z FK.
Joe Pineda

Kilka dodatkowych komentarzy: Nie zgadzam się z twoim trzecim stwierdzeniem, chyba że jest ono specyficzne dla Oracle. Przynajmniej w SQL S. albo USUŃ, albo TRUNCATE nie odzyskujesz miejsca (tzn. Pliki bazy danych nie kurczą się na dysku twardym), chyba że wyraźnie o to poprosisz.
Joe Pineda

1
Piąte oświadczenie: możesz wycofać TABELĘ
OBCIĄŻENIA

1
Postgresql może wycofać TRUNCATE, a zatem również nie zatwierdza go automatycznie.
rfusca

5
DELETE zwraca liczbę usuniętych wierszy, ale TRUNCATE nie. To bardzo głupiutki punkt, ale warto o nim wspomnieć :)
Deepak Kumar Jha,

190

Różnica między obcinaniem a usuwaniem jest wymieniona poniżej:

+----------------------------------------+----------------------------------------------+
|                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)              |
+----------------------------------------+----------------------------------------------+

Obetnij zresetuj tożsamość tabeli Co to znaczy? Ale co z usunięciem?
Ravi,

1
@ jWeaver: Oznacza to, że gdy ustawisz właściwość Specity Specification na True dla pola klucza głównego, więc po wstawieniu danych do tej tabeli kolumna klucza podstawowego ma wartość 1,2,3,4,5 .... (jeśli tożsamość się zaczyna od 1, a ziarno to 1), a kiedy obetniesz tabelę, utracisz całą wartość tożsamości, więc kiedy zaczniesz wstawiać dane do tej tabeli, zacznie od 1 zamiast od tego, gdzie pozostała ostatnia. W DELETE jest odwrotnie, zachowuje wartość tożsamości nawet po wykonaniu instrukcji DELETE. Przepraszamy za błąd drugiego punktu porównania w kolumnie USUŃ na powyższym obrazku.
Bhaumik Patel,

Wygląda na to, że odpowiadasz na SQL SERVER
Ravi

4
Zarówno TRUNCATE, jak i DELETE można przywrócić w SQL SERVER . A w drugim rzędzie USUŃ dawkę nie resetuj tożsamości. Jak teraz możesz edytować ten post? To zła rzecz w używaniu zdjęć w StackOverflow.
Mahmood Jenami,

2
Truncate jest wycofywane! (SQL SERVER)
Aimal Khan

55

UPUSZCZAĆ

Polecenie DROP usuwa tabelę z bazy danych. Wszystkie wiersze tabel, indeksy i uprawnienia również zostaną usunięte. Nie zostaną uruchomione żadne wyzwalacze DML. Nie można przywrócić operacji.

ŚCIĘTY

TRUNCATE usuwa wszystkie wiersze z tabeli. Nie można cofnąć operacji i nie zostaną uruchomione żadne wyzwalacze. W związku z tym TRUNCATE jest szybszy i nie wykorzystuje tyle miejsca na cofanie jak DELETE. Blokada poziomu stołu zostanie dodana podczas obcinania.

USUNĄĆ

Polecenie DELETE służy do usuwania wierszy z tabeli. Klauzuli WHERE można użyć do usunięcia tylko niektórych wierszy. Jeśli nie zostanie określony warunek GDZIE, wszystkie wiersze zostaną usunięte. Po wykonaniu operacji USUŃ musisz ZATWIERDZIĆ lub ZWRÓCIĆ transakcję, aby wprowadzić zmianę na stałe lub ją cofnąć. Pamiętaj, że ta operacja spowoduje uruchomienie wszystkich wyzwalaczy DELETE w tabeli. Blokada poziomu wiersza zostanie dodana podczas usuwania.

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


5
Ładne wyjaśnienie dla takiego początkującego jak ja
Vikas Kukreti

Krótko i słodko
ABH

23

Wszystkie dobre odpowiedzi, do których muszę dodać:

Ponieważ TRUNCATE TABLEjest to DDL ( Data Defination Language ), a nie DML ( Data Manipulation Langauge ), Delete Triggersnie działają.


Ach, wyzwala ... to dobry punkt. Dodam to do sporządzonej przeze mnie listy i uznam, że Polara, jeśli nie mam nic przeciwko.
David Aldridge

SQL Server nie pozwoli ci obciąć tabeli z kluczami obcymi, więc twój punkt kaskadowy może być dyskusyjny, w zależności od platformy.
Meff

PostgreSQL ma „TRUNCATE Trigger”
a_horse_with_no_name


17

W przypadku SQL Server lub MySQL, jeśli istnieje PK z automatycznym przyrostem, obcinanie wyzeruje licznik.


Aby to wyjaśnić, dotyczy to programu SQL Server, jeśli tabela ma kolumnę zdefiniowaną jako TOŻSAMOŚĆ. Opcja Usuń spowoduje zachowanie ostatniego automatycznie przypisanego identyfikatora, a opcja Obcinanie resetuje licznik.
Codewerks

Ponieważ pytanie jest oznaczone jako ORACLE, odpowiedź jest NIEPRAWIDŁOWA, w związku z czym jest odrzucona.
Guy

Ups, nie widziałem tagu wyroczni :)
mathieu

+1 prawda i resetuje to do 0 . Jeśli zamiast tego chcesz mieć wartość 1 :DBCC CHECKIDENT (table_name, RESEED, 1)
JohnB

Dodałem to do odpowiedzi społeczności i uczyniłem ją bardziej przyjazną do dokumentowania problemów specyficznych dla dostawcy
David Aldridge

12

„Truncate nic nie rejestruje” jest poprawne. Poszedłbym dalej:

Obcięcie nie jest wykonywane w kontekście transakcji.

Przewaga szybkości obcięcia nad usuwaniem powinna być oczywista. Ta przewaga waha się od trywialnych do ogromnych, w zależności od twojej sytuacji.

Widziałem jednak, że obcięcie nieumyślnie narusza integralność referencyjną i narusza inne ograniczenia. Siła, którą zyskujesz, modyfikując dane poza transakcją, musi być zrównoważona z odpowiedzialnością, którą dziedziczysz, gdy przechodzisz po linie bez sieci.


7

TRUNCATEjest instrukcją DDL, podczas gdy DELETEjest instrukcją DML. Poniżej znajdują się różnice między nimi:

  1. Ponieważ TRUNCATEjest to instrukcja DDL ( język definicji danych ), nie wymaga zatwierdzenia, aby zmiany były trwałe. Z tego powodu wiersze usunięte przez obcinanie nie mogły zostać przywrócone. Z drugiej strony DELETEznajduje się instrukcja DML ( język manipulacji danymi ), dlatego wymaga wyraźnego zatwierdzenia, aby efekt był trwały.

  2. TRUNCATEzawsze usuwa wszystkie wiersze z tabeli, pozostawiając tabelę pustą i nienaruszoną strukturę tabeli, ale DELETEmoże warunkowo usunąć warunek, jeśli użyto klauzuli where.

  3. Wierszy usuniętych przez TRUNCATE TABLEinstrukcję nie można przywrócić i nie można określić klauzuli where w TRUNCATEinstrukcji.

  4. TRUNCATEinstrukcje nie wyzwalają wyzwalaczy w przeciwieństwie do DELETEinstrukcji usuwania wyzwalacza na instrukcji

Oto bardzo dobry link związany z tematem.


6

Tak, DELETE działa wolniej, TRUNCATE jest szybszy. Dlaczego?

DELETE musi odczytać rekordy, sprawdzić ograniczenia, zaktualizować blok, zaktualizować indeksy i wygenerować ponawianie / cofanie. Wszystko to wymaga czasu.

TRUNCATE po prostu dostosowuje wskaźnik w bazie danych dla tabeli (High Water Mark) i poof! dane zniknęły.

Jest to specyficzne dla Oracle, AFAIK.


PostgreSQL również jest podobny do tego.
Gavin M. Roy

6

ŚCIĘTY

TRUNCATE Zapytanie SQL usuwa wszystkie wiersze z tabeli, bez rejestrowania usuniętych pojedynczych wierszy.

  • TRUNCATE to polecenie DDL.
  • TRUNCATE jest wykonywane przy użyciu blokady tabeli, a cała tabela jest blokowana w celu usunięcia wszystkich rekordów.
  • Nie możemy używać klauzuli WHERE z TRUNCATE.
  • TRUNCATE usuwa wszystkie wiersze z tabeli.
  • Minimalne logowanie do dziennika transakcji, dzięki czemu wydajność jest szybsza.
  • TRUNCATE TABLE usuwa dane poprzez cofnięcie przydziału stron danych używanych do przechowywania danych tabeli i zapisuje tylko dezalokacje stron w dzienniku transakcji.
  • Aby użyć opcji Obcinaj na stole, potrzebujesz przynajmniej ZMIEŃ pozwolenie na stole.
  • Truncate zużywa mniej miejsca na transakcję niż instrukcja Delete.
  • Obcięcia nie można używać z widokami indeksowanymi.
  • TRUNCATE jest szybszy niż DELETE.

USUNĄĆ

Aby wykonać kolejkę DELETE, wymagane są uprawnienia do usuwania w tabeli docelowej. Jeśli musisz użyć klauzuli WHERE w USUŃ, wymagane są również wybrane uprawnienia.

  • DELETE to polecenie DML.
  • USUŃ jest wykonywana przy użyciu blokady wiersza, każdy wiersz w tabeli jest zablokowany do usunięcia.
  • Możemy użyć klauzuli where z DELETE do filtrowania i usuwania określonych rekordów.
  • Polecenie DELETE służy do usuwania wierszy z tabeli w zależności od warunku GDZIE.
  • Utrzymuje dziennik, więc jest wolniejszy niż TRUNCATE.
  • Instrukcja DELETE usuwa wiersze pojedynczo i rejestruje wpis w dzienniku transakcji dla każdego usuniętego wiersza.
  • Tożsamość kolumny zachowaj DELETE zachowuje tożsamość.
  • Aby użyć opcji Usuń, musisz mieć uprawnienia do usuwania w tabeli.
  • Usuń używa więcej miejsca na transakcję niż instrukcja Obcinaj.
  • Usuń można używać z widokami indeksowanymi.

5

Jeśli przypadkowo usunąłeś wszystkie dane z tabeli za pomocą Delete / Truncate. Możesz wycofać zatwierdzoną transakcję. Przywróć ostatnią kopię zapasową i uruchom dziennik transakcji do czasu, kiedy nastąpi usunięcie / obcięcie.

Powiązane informacje poniżej pochodzą z postu na blogu :

Podczas pracy z bazą danych korzystamy z funkcji Usuń i Obetnij, nie znając różnic między nimi. W tym artykule omówimy różnicę między usuwaniem a obcięciem w Sql.

Usunąć:

  • Usuń to polecenie DML.
  • Instrukcja usuwania jest wykonywana przy użyciu blokady wiersza, każdy wiersz w tabeli jest zablokowany do usunięcia.
  • Możemy określić filtry w klauzuli where.
  • Usuwa określone dane, jeśli istnieje warunek.
  • Usuń działania wyzwalacza, ponieważ operacje są rejestrowane indywidualnie.
  • Wolniej niż Obcinaj, ponieważ przechowuje dzienniki

Ścięty

  • Obcięcie to polecenie DDL.
  • Obcięta tabela zawsze blokuje tabelę i stronę, ale nie każdy wiersz, ponieważ usuwa wszystkie dane.
  • Nie można użyć warunku Where.
  • Usuwa wszystkie dane.
  • Tabela obcinania nie może aktywować wyzwalacza, ponieważ operacja nie rejestruje usunięć poszczególnych wierszy.
  • Szybszy pod względem wydajności, ponieważ nie prowadzi żadnych dzienników.

Uwaga: Usuń i Obetnij oba mogą być przywrócone, gdy są używane z transakcją. Jeśli transakcja zostanie wykonana, oznacza to popełnienie, nie możemy wycofać polecenia Skróć, ale nadal możemy cofnąć Usuń polecenie z plików dziennika, ponieważ usunięcie zapisu zapisuje je w pliku dziennika na wypadek, gdyby w przyszłości konieczne było wycofanie z plików dziennika.

Jeśli masz ograniczenie klucza obcego odnoszące się do tabeli, którą próbujesz obciąć, to nie zadziała, nawet jeśli tabela odwołująca się nie zawiera danych. Wynika to z tego, że sprawdzanie klucza obcego odbywa się za pomocą DDL, a nie DML. Można to obejść, tymczasowo wyłączając ograniczenia kluczy obcych w tabeli.

Usuń tabelę jest zarejestrowaną operacją. Usunięcie każdego wiersza jest rejestrowane w dzienniku transakcji, co powoduje, że jest powolny. Obcięta tabela usuwa również wszystkie wiersze w tabeli, ale nie rejestruje usunięcia każdego wiersza, lecz rejestruje dezalokację stron danych tabeli, co przyspiesza.

~ Jeśli przypadkowo usunąłeś wszystkie dane z tabeli za pomocą Delete / Truncate. Możesz wycofać zatwierdzoną transakcję. Przywróć ostatnią kopię zapasową i uruchom dziennik transakcji do czasu, kiedy nastąpi usunięcie / obcięcie.


1
Dziękuję @Lucas: wprowadził treść. Po prostu umieściłem go w cytacie blokowym, aby było jasne, że pochodzi on ze źródła różnicowego.
AstroCB,

4

W SQL Server 2005 uważam, że można cofnąć obcięcie


4

USUNĄĆ

Polecenie DELETE służy do usuwania wierszy z tabeli. Klauzuli WHERE można użyć do usunięcia tylko niektórych wierszy. Jeśli nie zostanie określony warunek GDZIE, wszystkie wiersze zostaną usunięte. Po wykonaniu operacji USUŃ musisz ZATWIERDZIĆ lub ZWRÓCIĆ transakcję, aby wprowadzić zmianę na stałe lub ją cofnąć. Pamiętaj, że ta operacja spowoduje uruchomienie wszystkich wyzwalaczy DELETE w tabeli.

ŚCIĘTY

TRUNCATE usuwa wszystkie wiersze z tabeli. Nie można cofnąć operacji i nie zostaną uruchomione żadne wyzwalacze. Jako taki, TRUCATE jest szybszy i nie wykorzystuje tyle miejsca na cofanie jak DELETE.

UPUSZCZAĆ

Polecenie DROP usuwa tabelę z bazy danych. Wszystkie wiersze tabel, indeksy i uprawnienia również zostaną usunięte. Nie zostaną uruchomione żadne wyzwalacze DML. Nie można przywrócić operacji.


DROP i TRUNCATE to polecenia DDL, natomiast DELETE to polecenie DML. Dlatego operacje DELETE można przywrócić (cofnąć), natomiast operacji DROP i TRUNCATE nie można przywrócić.

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


Czy to dodaje coś do obecnych odpowiedzi?
David Aldridge,

3

TRUNCATE można wycofać, jeśli jest zawarty w transakcji.

Sprawdź dwa odnośniki poniżej i sprawdź się: -

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 to jedno z niesławnych pytań podczas wywiadów SQL. Tylko upewnij się, że wyjaśniłeś to poprawnie ankieterowi, bo może to kosztować pracę. Problem polega na tym, że niewielu jest świadomych, więc najprawdopodobniej uznają odpowiedź za błędną, jeśli powiesz im, że TAK można skrócić.


2

Niewielka korekta oryginalnej odpowiedzi - usunięcie generuje również znaczne ilości powtórzeń (ponieważ cofnięcie jest chronione przez ponawianie). Można to zobaczyć na podstawie danych wyjściowych autotrace:

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

jego stary wątek, ale według mojego zrozumienia, obcinanie generuje tylko dobrą liczbę dzienników ponownych, przy czym podczas usuwania generowane jest cofanie i ponawianie obu.
Saurabh Sinha

2

Oto moja szczegółowa odpowiedź na temat różnicy między DELETE a TRUNCATE w SQL Server

Usuń dane : po pierwsze, oba można wykorzystać do usunięcia wierszy z tabeli.
Ale USUŃ można użyć do usunięcia wierszy nie tylko ze tabeli, ale także z WIDOKU lub wyniku OPENROWSET lub OPENQUERY, w zależności od możliwości dostawcy.

Klauzula FROM : Za pomocą DELETE można również usuwać wiersze z jednej tabeli / widoku / rowset_function_limited na podstawie wierszy z innej tabeli przy użyciu innej klauzuli FROM. W tej klauzuli FROM możesz także napisać normalne warunki JOIN. W rzeczywistości możesz utworzyć instrukcję DELETE z instrukcji SELECT, która nie zawiera żadnych funkcji agregujących, zastępując SELECT DELETE i usuwając nazwy kolumn.
Z TRUNCATE nie możesz tego zrobić.

GDZIE : TRUNCATE nie może mieć GDZIE Warunki, ale USUŃ może. Oznacza to, że przy pomocy TRUNCATE nie można usunąć określonego wiersza lub określonej grupy wierszy. TRUNCATE TABLE jest podobna do instrukcji DELETE bez klauzuli WHERE.

Wydajność : TRUNCATE TABLE jest szybszy i zużywa mniej zasobów systemowych i dzienników transakcji. Jednym z powodów są blokady stosowane przez którąkolwiek z instrukcji. Instrukcja DELETE jest wykonywana przy użyciu blokady wiersza, każdy wiersz w tabeli jest zablokowany do usunięcia. TRUNCATE TABLE zawsze blokuje tabelę i stronę, ale nie każdy wiersz.

Dziennik transakcji : instrukcja DELETE usuwa wiersze pojedynczo i dokonuje indywidualnych wpisów w dzienniku transakcji dla każdego wiersza.
TRUNCATE TABLE usuwa dane poprzez cofnięcie przydziału stron danych używanych do przechowywania danych tabeli i zapisuje tylko dezalokacje stron w dzienniku transakcji.

Strony : po wykonaniu instrukcji DELETE tabela może nadal zawierać puste strony. TRUNCATE usuwa dane poprzez cofnięcie przydziału stron danych używanych do przechowywania danych tabeli.

Trigger : TRUNCATE nie aktywuje wyzwalaczy usuwania w tabeli. Musisz więc być bardzo ostrożny podczas korzystania z TRUNCATE. Nigdy nie należy używać TRUNCATE, jeśli w tabeli zdefiniowano usuwanie Trigger, aby wykonać pewne automatyczne czyszczenie lub rejestrowanie po usunięciu wierszy.

Kolumna tożsamości : W przypadku TRUNCATE, jeśli tabela zawiera kolumnę tożsamości, licznik dla tej kolumny jest resetowany do wartości początkowej zdefiniowanej dla kolumny. Jeśli nie zdefiniowano nasion, używana jest wartość domyślna 1. DELETE nie resetuje licznika tożsamości. Więc jeśli chcesz zachować licznik tożsamości, użyj zamiast tego DELETE.

Replikacja : USUŃ można użyć względem tabeli używanej w replikacji transakcyjnej lub replikacji scalającej.
Podczas gdy TRUNCATE nie może być użyte w stosunku do tabel zaangażowanych w replikację transakcyjną lub replikację scalającą.

Wycofanie : instrukcja DELETE może zostać wycofana.
TRUNCATE można również przywrócić, pod warunkiem że jest on zawarty w bloku TRANSACTION, a sesja nie jest zamknięta. Po zamknięciu sesji nie będzie można wycofać TRUNCATE.

Ograniczenia : Instrukcja DELETE może się nie powieść, jeśli narusza wyzwalacz lub próbuje usunąć wiersz, do którego odwołują się dane w innej tabeli z ograniczeniem FOREIGN KEY. Jeśli DELETE usuwa wiele wierszy, a jeden z usuniętych wierszy narusza wyzwalacz lub ograniczenie, instrukcja jest anulowana, zwracany jest błąd i żadne wiersze nie są usuwane.
A jeśli zostanie użyte USUŃ przeciwko Widokowi, Widok ten musi być widokiem aktualizowanym. Nie można użyć TRUNCATE w stosunku do tabeli używanej w widoku indeksowanym.
Funkcja TRUNCATE nie może być używana w odniesieniu do tabeli, do której odwołuje się ograniczenie KLUCZ ZAGRANICZNY, chyba że tabela ma klucz obcy, który się do niej odwołuje.


Cześć Mangal - dziękuję za odpowiedź, szczególnie za problemy specyficzne dla SQL * Servera. Czy uważasz, że możesz zintegrować te punkty z odpowiedzią na Wiki społeczności, która została zaakceptowana?
David Aldridge

Tak, jasne, ale jak i gdzie? Przepraszam, jestem tu nowy.
Mangal Pardeshi,

„Więc jeśli chcesz zachować licznik tożsamości, użyj DELETE” - możesz użyćDECLARE @ai as bigint SET @ai =IDENT_CURRENT('tablename') TRUNCATE TABLE tablename DBCC checkident('tablename', RESEED, @ai)
mpag,

1

Największą różnicą jest to, że obcinanie jest operacją niezapisaną podczas usuwania.

Oznacza to po prostu, że w przypadku awarii bazy danych nie można odzyskać danych obsługiwanych przez obcinanie, ale można je usunąć.

Więcej informacji tutaj


1

Instrukcja DELETE: To polecenie usuwa tylko wiersze z tabeli na podstawie warunku podanego w klauzuli where lub usuwa wszystkie wiersze z tabeli, jeśli nie określono żadnego warunku. Ale nie zwalnia miejsca zawierającego tabelę.

Składnia instrukcji SQL DELETE jest następująca:

USUŃ Z nazwy_tabeli [GDZIE warunki];

Instrukcja TRUNCATE: To polecenie służy do usunięcia wszystkich wierszy z tabeli i zwolnienia miejsca zawierającego tabelę.


1

USUNĄĆ

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]

ŚCIĘTY

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]

Więcej informacji na stronie

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


1

Kolejną różnicą między tymi dwiema operacjami jest to, że jeśli tabela zawiera kolumnę tożsamości, licznik dla tej kolumny jest resetowany 1 (lub do wartości początkowej zdefiniowanej dla kolumny) w TRUNCATE. DELETE nie ma tego wpływu.


0

Krótko mówiąc, obcinanie niczego nie rejestruje (jest znacznie szybsze, ale nie można go cofnąć), podczas gdy usuwanie jest rejestrowane (i może być częścią większej transakcji, spowoduje wycofanie itp.). Jeśli masz dane, których nie chcesz w tabeli w dev, zwykle lepiej je obciąć, ponieważ nie ryzykujesz wypełnienia dziennika transakcji


0

Głównym powodem, dla którego jest to przydatne, jest konieczność odświeżenia danych w wielomilionowej tabeli wierszy, ale nie chcesz ich odbudowywać. „Usuń *” trwałoby wieczność, podczas gdy wpływ Truncate na wyniki byłby znikomy.


0

Nie można wykonać DDL przez dblink.


0

Skomentowałbym post Matthieu, ale nie mam jeszcze przedstawiciela ...

W MySQL licznik automatycznego przyrostu jest resetowany przy obcinaniu, ale nie przy usuwaniu.


0

Nie jest tak, że obcięcie nie rejestruje niczego w SQL Server. truncate nie rejestruje żadnych informacji, ale rejestruje stronę dezalokacji danych dla tabeli, na której uruchomiono TRUNCATE.

i skrócony rekord można przywrócić, jeśli zdefiniujemy transakcję na początku, i możemy odzyskać skrócony rekord po jego wycofaniu. Ale nie można odzyskać skróconych rekordów z kopii zapasowej dziennika transakcji po zatwierdzonej skróconej transakcji.


0

Przykład ścięcia można również przywrócić tutaj

begin Tran
delete from  Employee

select * from Employee
Rollback
select * from Employee

0

Obcinanie i usuwanie w SQL to dwa polecenia służące do usuwania lub usuwania danych z tabeli. Chociaż dość podstawowe z natury oba polecenia Sql mogą powodować wiele problemów, dopóki nie zapoznasz się ze szczegółami przed ich użyciem. Nieprawidłowy wybór polecenia może spowodować bardzo powolny proces lub nawet wysadzenie segmentu dziennika, jeśli trzeba usunąć zbyt dużo danych, a segment dziennika nie wystarczy. Dlatego tak ważne jest, aby wiedzieć, kiedy należy użyć polecenia obcięcia i usunięcia w SQL, ale przed ich użyciem należy pamiętać o różnicach między przycinaniem i usuwaniem, a na ich podstawie powinniśmy dowiedzieć się, kiedy DELETE jest lepszą opcją do usunięcia data lub TRUNCATE powinny być używane do czyszczenia tabel.

Sprawdź sprawdź kliknij tutaj


0

Wydając instrukcję TRUNCATE TABLE, instruujesz SQL Server, aby usunął każdy rekord w tabeli, bez konieczności rejestrowania lub przetwarzania transakcji.


0

Instrukcja DELETE może zawierać klauzulę WHERE, aby usunąć określone rekordy, natomiast instrukcja TRUNCATE nie wymaga żadnej i usuwa całą tabelę. Co ważne, instrukcja DELETE rejestruje datę usunięcia, podczas gdy instrukcja TRUNCATE nie.


0

Jeszcze jedna różnica specyficzna dla serwera Microsoft SQL Server polega na tym, deleteże można użyć outputinstrukcji do śledzenia, które rekordy zostały usunięte, np .:

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

Nie możesz tego zrobić truncate.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.