Яка різниця між TRUNCATE та DELETE в SQL


303

Яка різниця між TRUNCATEі DELETEв SQL?

Якщо ваша відповідь залежить від платформи, будь ласка, вкажіть це.


4
Усі відповіді залежать від платформи. У стандартній SQL немає команди TRUNCATE. Отже, це властивість і означає різну річ для кожного постачальника СУБД.
nvogel

Відповідь дуже конкретна для впровадження, як і має бути, оскільки, як вказував sqlvogel, це нестандартна команда (TRUNCATE). Або залиште цей тег «oracle» або давайте відповідь на нього у стилі вікі-спільноти та вкажіть наслідки для кожного головного RDBMS (Oracle, MS-MSQL, PostgreSQL всі реалізують TRUNCATE ...)
reedstrm

Якщо трансакція виконана, означає COMMITED, тоді ми не можемо відкатати команду TRUNCATE, але ми все одно можемо відкатати команду DELETE з файлів LOG, оскільки DELETE записує їх у файл журналу на випадок, якщо це потрібно для відкату в майбутньому з файлів LOG.

Відповіді:


272

Ось перелік відмінностей. Я наголосив на особливостях Oracle, і, сподіваємось, спільнота також може додати до певної різниці інших постачальників. Відмінності, характерні для більшості постачальників, можуть знаходитись безпосередньо під заголовками, а відмінності виділяються нижче.


Загальний огляд

Якщо ви хочете швидко видалити всі рядки з таблиці, і ви дійсно впевнені, що хочете це зробити, і у вас немає сторонніх ключів проти таблиць, то TRUNCATE, ймовірно, буде швидше, ніж DELETE .

Необхідно розглянути різні специфічні для системи питання, як це детально описано нижче.


Тип заяви

Видалити - це DML, скорочення - DDL ( що таке DDL та DML? )


Коміт і відкат

Змінна за постачальником

SQL * Сервер

Обрізання можна відкотити назад.

PostgreSQL

Обрізання можна відкотити назад.

Oracle

Оскільки TRUNCATE є DDL, це включає два коміти, один до і після виконання оператора. Тому обрізання не можна повернути назад, і невдача в процесі урізання все одно призведе до зобов'язання.

Однак дивіться Flashback нижче.


Меліорація

Видалення не відновлює простір, Обрізання відновлює простір

Oracle

Якщо ви використовуєте пункт REUSE STORAGE, то сегменти даних не виділяються, що може бути незначно ефективнішим, якщо таблицю потрібно перезавантажити даними. Значок високої води скидається.


Обсяг рядків

Видалити можна використовувати для видалення всіх рядків або лише підмножини рядків. Урізання видаляє всі рядки.

Oracle

Коли таблиця розділяється, окремі розділи можуть бути усічені окремо, таким чином можливе часткове видалення всіх даних таблиці.


Типи об'єктів

Видалити можна застосувати до таблиць і таблиць всередині кластеру. Скорочення стосується лише таблиць або всього кластеру. (Може бути специфічним для Oracle)


Ідентифікатор об'єкта даних

Oracle

Видалення не впливає на ідентифікатор об'єкта даних, але усікання призначає новий ідентифікатор об’єкта даних, якщо ніколи не було вставки проти таблиці з моменту її створення. Навіть одна вкладена вставка, яка повертається назад, призведе до присвоєння нового ідентифікатора об'єкта даних при усіканні .


Flashback (Oracle)

Flashback працює в рамках видалення, але усікання запобігає спалаху до станів перед операцією.

Однак з 11gR2 функція FLASHBACK ARCHIVE дозволяє це, за винятком Express Edition

Використання FLASHBACK в Oracle http://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_flashback.htm#ADFNS638


Привілеї

Змінна

Oracle

Видалення може бути надано на столі іншому користувачеві або ролі, але усікати неможливо без використання DROP ANY TABLE grant.


Повторити / Скасувати

Видалення створює невелику кількість повторень та велику кількість скасування. Урізання утворює незначну кількість кожного.


Покажчики

Oracle

Операція обрізання знову робить непридатними індекси. Видалення не робить.


Іноземні ключі

Урізання не може бути застосоване, коли включений зовнішній ключ посилається на таблицю. Лікування видаленням залежить від конфігурації сторонніх ключів.


Блокування столу

Oracle

Обрізання вимагає ексклюзивного блокування таблиці, для видалення потрібен загальний блочний стіл. Отже, вимкнення блокування таблиць - це спосіб запобігання скороченню операцій на столі.


Тригери

Тригери DML не спрацьовують на усікання.

Oracle

Доступні тригери DDL.


Віддалене виконання

Oracle

Скорочення не може бути видане через посилання на базу даних.


Стовпці особи

SQL * Сервер

Скорочення скидає послідовність для типів стовпців IDENTITY, видалення не робить.


Набір результатів

У більшості реалізацій DELETEоператор може повернути клієнту рядки, які були видалені.

наприклад, у підпрограмі Oracle PL / SQL ви можете:

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

Не розумію Вашого 4-го твердження: якщо я скажу DELETE [ ] З таблиці; тоді * всі рядки з цієї таблиці будуть видалені, якщо FK не зупинить її. До речі, я думаю, що це специфічно для SQL Server, ви не можете використовувати TRUNCATE на таблицях з FK.
Джо Пінеда

Ще кілька коментарів: Я не погоджуюся з вашим третім твердженням, якщо тільки це не стосується Oracle. Принаймні, у випадку SQL S. або якщо ВИДАЛИТИ, або TRUNCATE, ви не відновите простір (тобто файли бази даних не скорочуються на жорсткому диску), якщо ви спеціально не вимагаєте цього.
Джо Пінеда

1
5-я заява: ви можете
відмовити ТРУНКАЦІЙНУ

1
Postgresql може відкатати TRUNCATE і, таким чином, також не автоматично його передавати.
rfusca

5
DELETE повертає кількість видалених рядків, але TRUNCATE - ні. Це дуже дурний момент, але варто згадати його :)
Діпак Кумар Джа

190

Різниця між усіченням та видаленням вказана нижче:

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

Укорочення скидання ідентичності таблиці Що це означає? Але що з видаленням?
Раві

1
@jWeaver: Це означає, що для параметра властивості специфікації ідентичності встановлено значення True для первинного ключа, тому коли ви вставляєте дані в цю таблицю, стовпець первинного ключа має значення, як 1,2,3,4,5 .... (якщо ідентифікатор починається з 1, а насіння - 1), і коли ви врізаєте таблицю, вона втратить усе значення ідентичності, тож коли ви знову почнете вставляти дані в цю таблицю, вона почне починатись з 1, а не з останнього. У DELETE це зворотне значення, воно зберігає значення ідентичності навіть після виконання оператора DELETE. Вибачте за помилку другої точки порівняння у стовпчику DELETE на зображенні вище
Bhaumik Patel

Схоже, ви відповідаєте за SQL SERVER
Раві

4
І TRUNCATE, і DELETE можна повернути назад в SQL SERVER . А у 2-му ряду ВИДАЛИТИ дозу не скидайте особу. Тепер, як можна редагувати цю публікацію? Це погано у використанні зображень у StackOverflow.
Махмуд Дженамі

2
Обрізання відкочується назад! (SQL SERVER)
Аймал Хан

55

ДРОП

Команда DROP видаляє таблицю з бази даних. Усі рядки, індекси та привілеї таблиць також будуть видалені. Жодні триггери DML не запускаються. Операцію не можна повернути назад.

TRUNCATE

TRUNCATE видаляє всі рядки з таблиці. Операцію неможливо повернути назад, і тригери не будуть активовані. Таким чином, TRUNCATE швидше і не використовує стільки місця для скасування, як DELETE. Блокування рівня таблиці буде додано при обрізанні.

УДАЛИТИ

Команда DELETE використовується для видалення рядків із таблиці. Заява WHERE може використовуватися лише для видалення деяких рядків. Якщо умови WHERE не вказані, всі рядки будуть видалені. Виконуючи операцію DELETE, вам потрібно ЗДОРОВИТИ або РОЗВИЩИТИ транзакцію, щоб зробити зміну постійною або скасувати її. Зауважте, що ця операція призведе до запуску всіх тригерів DELETE на столі. Блокування рівня рядка буде додано при видаленні.

Від: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands


5
Приємне пояснення для такого початківця, як я
Вікас Кукреті

Короткий і солодкий
ABH

23

Усі хороші відповіді, до яких я повинен додати:

Оскільки TRUNCATE TABLEDDL ( Мова визначення даних ), а не команда DML (" Маніпуляція з даними" ), Delete Triggersне виконується.


А, тригери ... це хороший момент. Я додам це до списку, який я склав, і зараховую вам Polara, якщо це нормально.
Девід Олдрідж

SQL Server не дозволить вам обрізати таблицю із сторонніми ключами, тому ваша каскадна точка може бути суперечкою, залежно від платформи.
Меф

PostgreSQL має "TRUNCATE Trigger"
a_horse_with_no_name


17

За допомогою SQL Server або MySQL, якщо є ПК з автоматичним збільшенням, усікання скине лічильник.


Для уточнення це стосується SQL Server, якщо в таблиці є стовпець, визначений як ІДЕНТИЧНІСТЬ. Видалення підтримує останній автоматично призначений ідентифікатор, а Truncate скидає лічильник.
Codewerks

Оскільки питання позначено ОРАКЛ, то ця відповідь є НЕПРИМОГО, тому неприйнятна.
Хлопець

oops, не побачив тег oracle :)
mathieu

+1 true, і він скидає його до 0 . Якщо ви хочете, щоб це було замість 1 :DBCC CHECKIDENT (table_name, RESEED, 1)
JohnB

Я додав це до відповіді громади і зробив це трохи привітніше для документування проблем, пов’язаних з постачальниками
Девід Олдрідж,

12

Правильне значення "усікання не записує". Я б пішов далі:

Скорочення не виконується в контексті транзакції.

Перевага скорочення скорочення над видаленням має бути очевидним. Ця перевага коливається від тривіальної до величезної, залежно від вашої ситуації.

Однак я бачив, як усікання ненавмисно порушує референтну цілісність та порушує інші обмеження. Потужність, яку ви отримуєте, змінюючи дані поза трансакцією, має бути збалансована проти відповідальності, яку ви успадковуєте, коли ходите по канату без мережі.


7

TRUNCATEє оператором DDL, тоді DELETEяк оператором DML. Нижче наведені відмінності між цими двома:

  1. Оскільки оператор TRUNCATEDDL ( мова визначення даних ), він не вимагає зобов'язання робити зміни постійними. І це є причиною того, що рядки, видалені усіканням, не можна повернути назад. З іншого боку, DELETEце висловлювання DML ( мова маніпулювання даними ), отже, вимагає явної фіксації, щоб зробити його ефект постійним.

  2. TRUNCATEзавжди видаляє всі рядки з таблиці, залишаючи таблицю порожньою, а структуру таблиці недоторканою, тоді як DELETEможе умовно видаляти, якщо використовується застереження де

  3. Рядки, видалені TRUNCATE TABLEоператором, не можна відновити, і ви не можете вказати пункт де у TRUNCATEвиписці.

  4. TRUNCATEоператори не спрацьовують тригери, на відміну від тригера видалення на DELETEоператорі

Ось дуже гарне посилання, що стосується теми.


6

Так, DELETE повільніше, TRUNCATE швидше. Чому?

DELETE повинен прочитати записи, перевірити обмеження, оновити блок, оновити індекси та створити повтор / скасувати. На все це потрібен час.

TRUNCATE просто налаштовує вказівник у базі даних для таблиці (Висока марка води) та пуф! даних немає.

Це специфічно для Oracle, AFAIK.


PostgreSQL також подібний до цього.
Гевін М. Рой

6

TRUNCATE

TRUNCATE SQL-запит видаляє всі рядки з таблиці, не реєструючи окремі видалення рядків.

  • TRUNCATE - команда DDL.
  • TRUNCATE виконується за допомогою блокування таблиці, а вся таблиця блокується для видалення всіх записів.
  • Ми не можемо використовувати пункт WHERE з TRUNCATE.
  • TRUNCATE видаляє всі рядки з таблиці.
  • Мінімальний вхід в журнал транзакцій, тому він швидше продуктивний.
  • TRUNCATE TABLE видаляє дані, розміщуючи сторінки даних, які використовуються для зберігання даних таблиці, і записує лише розсилки сторінок у журнал транзакцій.
  • Щоб використовувати обрізання на столі, вам потрібно принаймні ДОПОМОГА дозволу на стіл.
  • Truncate використовує менше місця транзакцій, ніж оператор Delete.
  • Обрізання не можна використовувати з індексованими представленнями.
  • TRUNCATE швидше DELETE.

УДАЛИТИ

Для виконання черги DELETE в цільовій таблиці потрібні дозволи видалення. Якщо вам потрібно використовувати пункт WHERE у DELETE, необхідні дозволи вибору також потрібні.

  • DELETE - команда DML.
  • DELETE виконується за допомогою блокування рядків, кожен рядок у таблиці блокується для видалення.
  • Ми можемо використовувати де пункт із DELETE для фільтрації та видалення конкретних записів.
  • Команда DELETE використовується для видалення рядків із таблиці на основі умови WHERE.
  • Він підтримує журнал, тому він повільніше, ніж TRUNCATE.
  • Оператор DELETE видаляє по черзі рядки та записує запис у журналі транзакцій для кожного видаленого рядка.
  • Ідентифікатор збереження стовпця DELETE зберігає ідентичність.
  • Для використання "Видалити" вам потрібно дозволити DELETE на столі.
  • Для видалення використовується більше простору транзакцій, ніж у твердженні Truncate.
  • Видалити можна використовувати з індексованими видами.

5

Якщо випадково ви видалили всі дані з таблиці за допомогою Видалити / скоротити. Ви можете відкатати здійснену транзакцію. Відновіть останню резервну копію та запустіть журнал транзакцій до моменту, коли відбудеться Видалення / скорочення.

Нижче наведена відповідна інформація з публікації в блозі :

Працюючи над базою даних, ми використовуємо Видалити і скорочувати, не знаючи відмінностей між ними. У цій статті ми обговоримо різницю між видаленням і скороченням у Sql.

Видалити:

  • Видалити - це команда DML.
  • Оператор видалення виконується за допомогою блокування рядків, кожен рядок у таблиці заблокований для видалення.
  • Ми можемо вказати фільтри, де пункт.
  • Він видаляє вказані дані, якщо там існує умова.
  • Видалити активізатор діяльності, оскільки операція реєструється індивідуально.
  • Повільніше, ніж обрізати, оскільки він зберігає журнали

Обрізати

  • Урізати - це команда DDL.
  • Обрізана таблиця завжди блокує таблицю та сторінку, але не кожен рядок. Оскільки вона видаляє всі дані.
  • Неможливо використати стан.
  • Він видаляє всі дані.
  • Обрізана таблиця не може активувати тригер, оскільки операція не реєструє окремі видалення рядків.
  • Швидше в продуктивності, оскільки він не зберігає журналів.

Примітка: Видалення та обрізання обох можна повернути назад при використанні з транзакцією. Якщо трансакція виконана, це означає, що здійснено, ми не можемо відкатати команду «Відрізати», але ми все одно можемо відкатати команду «Видалити» з файлів журналу, оскільки видалити запис записує їх у журнал «Файл журналу», якщо це потрібно для відкату в майбутньому з файлів журналу.

Якщо у вас є обмеження для зовнішнього ключа, яке стосується таблиці, яку ви намагаєтеся скоротити, це не буде працювати, навіть якщо в таблиці, що посилається, немає в ній даних. Це тому, що перевірка зовнішніх ключів проводиться з DDL, а не з DML. Це можна усунути, тимчасово відключивши обмеження (-ів) іноземного ключа до таблиці.

Видалити таблицю - це зареєстрована операція. Таким чином, видалення кожного рядка входить у журнал транзакцій, що робить його повільним. Урізана таблиця також видаляє всі рядки в таблиці, але вона не записуватиме видалення кожного рядка, замість цього вона записує розстановку сторінок даних таблиці, що робить її швидшою.

~ Якщо випадково ви видалили всі дані з таблиці за допомогою Видалити / скоротити. Ви можете відкатати здійснену транзакцію. Відновіть останню резервну копію та запустіть журнал транзакцій до моменту, коли відбудеться Видалення / скорочення.


1
Дякую @Lucas: він наклав вміст. Я просто помістив це в блок-котирування, щоб зрозуміти, що це було з різниці.
AstroCB

4

У SQL Server 2005 я вважаю, що ви можете відкати усікання


4

УДАЛИТИ

Команда DELETE використовується для видалення рядків із таблиці. Заява WHERE може використовуватися лише для видалення деяких рядків. Якщо умови WHERE не вказані, всі рядки будуть видалені. Виконуючи операцію DELETE, вам потрібно ЗДОРОВИТИ або РОЗВИЩИТИ транзакцію, щоб зробити зміну постійною або скасувати її. Зауважте, що ця операція призведе до запуску всіх тригерів DELETE на столі.

TRUNCATE

TRUNCATE видаляє всі рядки з таблиці. Операцію неможливо повернути назад, і тригери не будуть активовані. Таким чином, TRUCATE швидше і не використовує стільки місця для скасування, як DELETE.

ДРОП

Команда DROP видаляє таблицю з бази даних. Усі рядки, індекси та привілеї таблиць також будуть видалені. Жодні триггери DML не запускаються. Операцію не можна повернути назад.


DROP і TRUNCATE - команди DDL, тоді як DELETE - команда DML. Тому операції DELETE можна повернути назад (скасувати), тоді як операції DROP та TRUNCATE не можна повернути назад.

Від: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands


Чи додає це щось до поточних відповідей?
Девід Олдрідж

3

TRUNCATE можна повернути назад, якщо він завершений в транзакції.

Будь ласка, перегляньте дві посилання нижче та протестуйте себе: -

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

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

TRUNCATE vs. DELETE - одне з сумнівних питань під час інтерв'ю SQL. Просто переконайтесь, що ви правильно пояснили його інтерв'юєру, інакше це може коштувати вам роботи. Проблема полягає в тому, що не багато хто знає, тому, швидше за все, вони вважатимуть відповідь неправильним, якщо ви скажете їм, що ТАК Truncate можна відкотити назад.


2

Невелике виправлення вихідної відповіді - видалення також генерує значну кількість повторень (оскільки скасування захищено повторно). Це видно з результатів автоматичного відстеження:

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

Ось моя детальна відповідь на різницю між DELETE та TRUNCATE у SQL Server

Видалити дані : Перше, що спочатку обидва можна використовувати для видалення рядків із таблиці.
Але DELETE може бути використаний для видалення рядків не тільки з таблиці, але й з VIEW або результату OPENROWSET або OPENQUERY відповідно до можливостей постачальника.

З пункту : З DELETE ви також можете видалити рядки з однієї таблиці / view / rowset_function_limited на основі рядків з іншої таблиці, використовуючи інший пункт FROM. У цьому пункті ВІД можна також записати нормальні умови JOIN. Насправді ви можете створити операцію DELETE з оператора SELECT, який не містить функцій сукупності, замінивши SELECT на DELETE та видаливши імена стовпців.
З TRUNCATE ви не можете цього зробити.

ДЕ : У TRUNCATE не можуть бути умови, де УСЕ, але DELETE може. Це означає, що за допомогою TRUNCATE ви не можете видалити конкретний рядок або конкретну групу рядків. TRUNCATE TABLE аналогічний оператору DELETE, не має пункту WHERE.

Продуктивність : TRUNCATE TABLE швидше і використовує менше ресурсів системи та журналу транзакцій. І однією з причин є блокування, які використовуються будь-якими твердженнями. Оператор DELETE виконується за допомогою блокування рядків, кожен рядок у таблиці заблокований для видалення. TRUNCATE TABLE завжди блокує таблицю та сторінку, але не кожен рядок.

Журнал транзакцій : оператор DELETE вилучає рядки по одному та робить окремі записи в журналі транзакцій для кожного рядка.
TRUNCATE TABLE видаляє дані, розміщуючи сторінки даних, які використовуються для зберігання даних таблиці, і записує лише розсилки сторінок у журнал транзакцій.

Сторінки : Після виконання оператора DELETE таблиця може містити порожні сторінки. TRUNCATE видаляє дані, розміщуючи сторінки даних, які використовуються для зберігання даних таблиці.

Тригер : TRUNCATE не активує тригери видалення на столі. Тому ви повинні бути дуже обережними під час використання TRUNCATE. Ніколи не слід використовувати TRUNCATE, якщо в таблиці визначено тригер видалення, щоб зробити якісь автоматичні дії очищення або реєстрації, коли рядки видаляються.

Стовпець ідентичності : З TRUNCATE, якщо таблиця містить стовпчик ідентичності, лічильник для цього стовпця скидається на значення насіння, визначене для стовпця. Якщо насіння не було визначено, використовується значення за замовчуванням 1. DELETE не скидає лічильник ідентичності. Отож, якщо ви хочете зберегти лічильник посвідчень, замість цього використовуйте DELETE.

Реплікація : DELETE можна використовувати проти таблиці, що використовується в транзакційній реплікації або об'єднанні реплікації.
Хоча TRUNCATE не можна використовувати проти таблиць, що беруть участь у транзакційній реплікації або об'єднанні реплікації.

Відкат : DELETE-заяву можна повернути назад.
TRUNCATE також можна повернути назад, якщо він укладений у блок TRANSACTION і сеанс не закритий. Після завершення сеансу ви не зможете відмовити TRUNCATE.

Обмеження : Оператор DELETE може вийти з ладу, якщо він порушує тригер або намагається видалити рядок, на який посилаються дані, в іншій таблиці з обмеженням FOREIGN KEY. Якщо DELETE видаляє декілька рядків, а будь-який із видалених рядків порушує тригер або обмеження, оператор скасовується, помилка повертається і жодні рядки не видаляються.
І якщо DELETE використовується проти View, цей перегляд повинен бути переглядом оновлених. TRUNCATE не можна використовувати проти таблиці, що використовується в індексованому поданні.
TRUNCATE не можна використовувати проти таблиці, на яку посилається обмеження FOREIGN KEY, за винятком випадків, коли таблиця, що містить зовнішній ключ, на яку посилається сама.


Привіт Мангал - дякую за відповідь, зокрема, щодо специфічних проблем SQL * Server. Як ви думаєте, ви могли б інтегрувати ці пункти у відповідь Вікі спільноти, яка була прийнята?
Девід Олдрідж

Так, звичайно, але як і де? Вибачте, що я тут новий.
Мангал Пардеші

"Отже, якщо ви хочете зберегти лічильник посвідчень, використовуйте DELETE", чи могли б ви скористатисяDECLARE @ai as bigint SET @ai =IDENT_CURRENT('tablename') TRUNCATE TABLE tablename DBCC checkident('tablename', RESEED, @ai)
mpag

1

Найбільша відмінність полягає в тому, що усічення - це не реєстрація, а видалення є.

Просто це означає, що у випадку збою бази даних ви не можете відновити дані, якими керується усікання, але при видаленні ви можете.

Детальніше тут


1

DELETE Заява: Ця команда видаляє лише рядки з таблиці, виходячи з умови, наведеної в пункті де, або видаляє всі рядки з таблиці, якщо жодна умова не вказана. Але це не звільняє простір, що містить стіл.

Синтаксис оператора SQL DELETE:

ВИДАЛИТИ ВІД таблиці_назви [WHERE умова];

Оператор TRUNCATE: Ця команда використовується для видалення всіх рядків із таблиці та звільнення місця, що містить таблицю.


1

УДАЛИТИ

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]

TRUNCATE

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]

Для більш детальної інформації відвідайте

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


1

Ще одна відмінність двох операцій полягає в тому, що якщо таблиця містить стовпчик ідентичності, лічильник для цього стовпця скидається 1 (або до значення насіння, визначеного для стовпця) у розділі TRUNCATE. DELETE не впливає на це.


0

Коротше кажучи, усікання нічого не записує (так це набагато швидше, але його не можна відмінити), тоді як видалення реєструється (і може бути частиною більшої транзакції, буде відкат тощо). Якщо у вас є дані, які ви не бажаєте в таблиці в девізі, зазвичай краще усікати, оскільки ви не ризикуєте заповнити журнал транзакцій


0

Найважливішою причиною цього є те, коли вам потрібно оновити дані в багатомільйонній таблиці рядків, але не хочете їх перебудовувати. "Видалити *" триватиме назавжди, тоді як ефективність дії Truncate буде незначною.


0

Неможливо зробити DDL через mblink.


0

Я б прокоментував пост Matthieu, але у мене ще немає відповіді ...

У MySQL лічильник автоматичного збільшення збільшується зі скороченням, але не з видаленням.


0

Справа в тому, що усікання нічого не записує в SQL Server. усікання не записує жодної інформації, але вона реєструє сторінку розміщення даних для таблиці, на якій ви запустили TRUNCATE.

і усічена запис може бути відкатаною, якщо ми визначимо транзакцію на початку і зможемо відновити усічену запис після відкату. Але не можна відновити усічені записи з резервної копії журналу транзакцій після вчиненої усіченої транзакції.


0

Срізати можна також на відкат тут

begin Tran
delete from  Employee

select * from Employee
Rollback
select * from Employee

0

Скорочення та видалення в SQL - це дві команди, які використовуються для видалення або видалення даних із таблиці. Обидві команди Sql, хоч і досить базові за своєю суттю, можуть створити багато проблем, поки ви не ознайомитеся з деталями перед його використанням. Неправильний вибір команди може призвести або до дуже повільного процесу, або навіть до підірвання сегмента журналу, якщо потрібно видалити занадто багато даних і сегмента журналу недостатньо. Ось чому важливо знати, коли використовувати команду для скорочення і видалення в SQL, але перед тим, як використовувати їх, ви повинні знати про відмінності між скороченнями і видаленням, і, виходячи з них, ми повинні мати можливість з'ясувати, коли DELETE є кращим варіантом для видалення дані або TRUNCATE повинні використовуватися для очищення таблиць.

Перевірте, натисніть тут


0

Випускаючи оператор TRUNCATE TABLE, ви доручаєте SQL Server видаляти всі записи в таблиці, без жодного журналу чи обробки транзакцій.


0

Оператор DELETE може містити пункт WHERE для видалення конкретних записів, тоді як оператор TRUNCATE не потребує ніяких даних і видаляє всю таблицю. Важливо, що оператор DELETE записує видалену дату, тоді як оператор TRUNCATE не робить.


0

Ще одна різниця, характерна для сервера microsoft sql, полягає в тому, що deleteви можете використовувати outputоператор для відстеження, які записи були видалені, наприклад:

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

Ви не можете цього зробити truncate.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.