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.
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
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:
DELETEFROM 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.
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.
TRUNCATEjest instrukcją DDL, podczas gdy DELETEjest instrukcją DML. Poniżej znajdują się różnice między nimi:
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.
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.
Wierszy usuniętych przez TRUNCATE TABLEinstrukcję nie można przywrócić i nie można określić klauzuli where w TRUNCATEinstrukcji.
TRUNCATEinstrukcje nie wyzwalają wyzwalaczy w przeciwieństwie do DELETEinstrukcji usuwania wyzwalacza na instrukcji
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.
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.
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.
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.
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ć.
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ć.
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>deletefrom t1;10918rows deleted.
Elapsed:00:00:00.58
Execution Plan----------------------------------------------------------0DELETE STATEMENT Optimizer=FIRST_ROWS (Cost=43 Card=1)10DELETEOF'T1'21TABLE 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)10918rows 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.
• 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.
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ę.
DELETEis a DML command
DELETE you can rollbackDelete= Only Delete- so it can be rolled back
InDELETE you can write conditions usingWHERE clause
Syntax –Deletefrom[Table]where[Condition]
ŚCIĘTY
TRUNCATEis 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)inTRUNCATE
Syntax –Truncatetable[Table]
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.
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
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.
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.
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.
Wydając instrukcję TRUNCATE TABLE, instruujesz SQL Server, aby usunął każdy rekord w tabeli, bez konieczności rejestrowania lub przetwarzania transakcji.
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.
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 .:
Odpowiedzi:
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
DELETE
instrukcja może zwrócić klientowi usunięte wiersze.np. w podprogramie Oracle PL / SQL można:
źródło
Różnica między obcinaniem a usuwaniem jest wymieniona poniżej:
źródło
Od: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
źródło
Wszystkie dobre odpowiedzi, do których muszę dodać:
Ponieważ
TRUNCATE TABLE
jest to DDL ( Data Defination Language ), a nie DML ( Data Manipulation Langauge ),Delete Triggers
nie działają.źródło
Podsumowanie usuwania Vs Truncate na serwerze SQL
Aby uzyskać pełny artykuł, kliknij ten link: http://codaffection.com/sql-server-article/delete-vs-truncate-in-sql-server/
Zaczerpnięte z artykułu mob dotnet: Usuń Vs Obcinaj w SQL Server
źródło
W przypadku SQL Server lub MySQL, jeśli istnieje PK z automatycznym przyrostem, obcinanie wyzeruje licznik.
źródło
DBCC CHECKIDENT (table_name, RESEED, 1)
„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.
źródło
TRUNCATE
jest instrukcją DDL, podczas gdyDELETE
jest instrukcją DML. Poniżej znajdują się różnice między nimi:Ponieważ
TRUNCATE
jest 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 stronyDELETE
znajduje się instrukcja DML ( język manipulacji danymi ), dlatego wymaga wyraźnego zatwierdzenia, aby efekt był trwały.TRUNCATE
zawsze usuwa wszystkie wiersze z tabeli, pozostawiając tabelę pustą i nienaruszoną strukturę tabeli, aleDELETE
może warunkowo usunąć warunek, jeśli użyto klauzuli where.Wierszy usuniętych przez
TRUNCATE TABLE
instrukcję nie można przywrócić i nie można określić klauzuli where wTRUNCATE
instrukcji.TRUNCATE
instrukcje nie wyzwalają wyzwalaczy w przeciwieństwie doDELETE
instrukcji usuwania wyzwalacza na instrukcjiOto bardzo dobry link związany z tematem.
źródło
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.
źródło
ŚCIĘTY
TRUNCATE Zapytanie SQL usuwa wszystkie wiersze z tabeli, bez rejestrowania usuniętych pojedynczych wierszy.
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.
źródło
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 :
źródło
W SQL Server 2005 uważam, że można cofnąć obcięcie
źródło
Od: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
źródło
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ć.
źródło
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:
źródło
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.
źródło
DECLARE @ai as bigint
SET @ai =IDENT_CURRENT('tablename')
TRUNCATE TABLE tablename
DBCC checkident('tablename', RESEED, @ai)
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
źródło
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ę.
źródło
USUNĄĆ
ŚCIĘTY
Więcej informacji na stronie
http://www.zilckh.com/what-is-the-difference-between-truncate-and-delete/
źródło
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.
źródło
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
źródło
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.
źródło
Nie można wykonać DDL przez dblink.
źródło
Skomentowałbym post Matthieu, ale nie mam jeszcze przedstawiciela ...
W MySQL licznik automatycznego przyrostu jest resetowany przy obcinaniu, ale nie przy usuwaniu.
źródło
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.
źródło
Przykład ścięcia można również przywrócić tutaj
źródło
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
źródło
Wydając instrukcję TRUNCATE TABLE, instruujesz SQL Server, aby usunął każdy rekord w tabeli, bez konieczności rejestrowania lub przetwarzania transakcji.
źródło
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.
źródło
Jeszcze jedna różnica specyficzna dla serwera Microsoft SQL Server polega na tym,
delete
że można użyćoutput
instrukcji do śledzenia, które rekordy zostały usunięte, np .:Nie możesz tego zrobić
truncate
.źródło