Разница между DROP и TRUNCATE

8

Что делает по- TRUNCATEдругому, чтобы бросить?

Я считаю, что он удаляет все данные в таблице, но сохраняет имя таблицы в базе данных, а также DROPудаляет все данные и таблицу. Это правильно ?

user1829823
источник
Связанные (и, вероятно, многие концепции будут похожи или идентичны, даже если не все мелкие детали таковы): dba.stackexchange.com/questions/30325/delete-vs-truncate
Аарон Бертран

Ответы:

22

DELETE - ЯЗЫК УПРАВЛЕНИЯ ДАННЫМИ (DML)

DELETEЗаявление в любом RDBMS считается DML заявление. Этот тип оператора, также известный как CRUD (Создать, Читать, Обновить, Удалить), предназначен для манипулирования данными в базе данных без влияния на базовую структуру объектов. На практике это означает:

  • DELETEЗаявление может быть доработано с помощью предиката либо через WHEREили JOINудалить некоторые или все строки в таблице.
  • DELETEЗаявление будет зарегистрировано в базе данных и может быть свернуто в рамках транзакции , если оператор не может .
  • Обычно a DELETEпринимает блокировки на уровне строк для данных, которые они удаляют, хотя при необходимости это может возрасти.
  • Из-за транзакционных издержек DELETEможет быть «медленным» (это относительно), но более безопасным, потому что он мелкозернистый.

TRUNCATE - ЯЗЫК ОПРЕДЕЛЕНИЯ ДАННЫХ (DDL)

TRUCNATEсчитается оператором DDL , означающим, что он предназначен для изменения способа определения объектов в базе данных. Обычно операторы DDL являются CREATE, ALTERили DROP, но TRUNCATEслужат определенной цели, «сбросом» таблицы путем удаления всех строк. Способы этого различаются между движками СУБД, и я бы рекомендовал взглянуть на специфику MySQL . Практические последствия TRUNCATE:

  • TRUNCATEне может быть мелкозернистым. В случае успеха он удалит все строки из вашей таблицы.
  • TRUNCATEобычно не регистрируется. Это зависит от РСУБД, и я бы посоветовал вам более конкретно взглянуть на то, как MySQL справляется с этим. (Подсказка, это зависит от версии.)
  • TRUNCATEтребует выполнения блокировки метаданных таблицы. То, как это на самом деле реализовано, может быть специфичным для СУБД, но, по сути, TRUNCATEпроцесс должен предотвращать перехват других процессов с таблицей для выполнения своего DDL.
  • Поскольку он (как правило) не регистрируется и не использует предикаты, a TRUNCATEбудет быстрее, чем a DELETE, но менее безопасен.

DROP TABLE - ЯЗЫК ОПРЕДЕЛЕНИЯ ДАННЫХ (DDL)

DROP TABLEидет дальше, чем TRUNCATEв том, что фактически полностью удаляет таблицу из базы данных. Это включает в себя удаление всех связанных объектов, таких как индексы и ограничения. Если вы отбросите таблицу, вы удалите не только все данные, но и структуру. Обычно это делается, когда таблица больше не нужна. Основная проблема заключается в том, что, поскольку a DROPявляется DDL, вы, как правило, не можете отменить его . Некоторые движки СУБД позволяют вам заключать DDL в транзакцию, чтобы вы могли откатить ее, но это не считается наилучшей практикой и ее следует избегать.

Майк Фал
источник
1
Я бы добавил, что TRUNCATE сбрасывает счетчик автоинкремента таблицы.
DanMan
5

Хотя я не могу говорить о MySQL, вот небольшая таблица, в которой сравниваются некоторые аспекты усечения и удаления в Oracle.

truncate                             |   delete
---------------------------------    |   ---------------------------
DDL   (implicitly commits,           |   DML
    including any pending DML)       |  
Does not generate undo info          |   Generates undo info
    (rollback statements)            |       (rollback statements)
Resets high water mark in table      |   Does not affect full-scan 
    and all indexes, improving       |       performance
    full-scan performance            |      
Does not fire any delete triggers    |   Fires delete triggers
Priv to truncate cannot be granted   |   --
    to truncate another user's       |  
    table; DROP ANY TABLE system     |   
    priv required                    |      
Storage for table and indexes can    |   Never shrinks the size of a 
    be set to initial size           |       table or indexes
Cannot truncate parent table from    |   --
    an established referential       |  
    integrity constraint; must       |  
    first disable foreign key        |  
    that references the parent       |  
    table                            |  

Информация, собранная из этой книги: http://amzn.com/0470395125

Надеюсь, это поможет любым пользователям Oracle, которые наткнулись на эту страницу, как я. Пожалуйста, не стесняйтесь указать, какие из этих пунктов верны в MySQL, если таковые имеются,

MollyOQ
источник
2

DROP TABLE TableName -> удалить таблицу из базы данных.

TRUNCATE TABLE TableName-> удалить данные таблицы, безусловно ... и сбросить IDENTITYначальное значение, если в таблице есть IDENTITYполе.

Реха Озенц
источник
1
  • DELETE: Команда DML, если вы выполняете команду удаления, удаляйте только ДАННЫЕ, не разбирая таблицу. Структура. Мы можем ОТКРЫТЬ строку данных в порядке строки

  • TRUNCATE: Команда DDL, если вы выполняете команду Truncate, удаляете только ДАННЫЕ без удаления таблицы. Структура, которую мы не можем откатить, урезать данные, удалить данные в режиме PAGE BY PAGE, урезать быстрее, чем удалить запрос.

  • DROP:, Команда DDL, если вы выполняете команду DROP, чтобы удалить (удалить) данные и общую структуру таблицы, мы также не сможем откатить данные

Санджив Редди
источник