Perbedaan antara DROP dan TRUNCATE


8

Apa yang TRUNCATEharus dilakukan dengan jatuh secara berbeda?

Saya percaya ini menghapus semua data dalam tabel tetapi menyimpan nama tabel dalam database, di mana seperti DROPmenghapus semua data dan tabel. Apakah ini benar ?


Terkait (dan mungkin banyak konsep akan serupa atau identik, bahkan jika tidak semua detail bagus): dba.stackexchange.com/questions/30325/delete-vs-truncate
Aaron Bertrand

Jawaban:


22

HAPUS - BAHASA MANIPULASI DATA (DML)

The DELETEpernyataan dalam setiap RDBMS dianggap sebagai DML pernyataan. Juga dikenal sebagai CRUD (Buat, Baca, Perbarui, Hapus), pernyataan semacam ini dimaksudkan untuk memanipulasi data dalam database tanpa mempengaruhi struktur objek yang mendasarinya. Apa artinya ini dalam istilah praktis adalah:

  • Sebuah DELETEpernyataan dapat fine-tuned menggunakan predikat baik melalui WHEREatau JOINmenghapus beberapa atau semua baris dalam sebuah tabel.
  • Sebuah DELETEpernyataan akan dicatat oleh database dan dapat diperpanjang kembali dalam transaksi jika pernyataan gagal.
  • Biasanya a DELETEakan mengambil kunci level baris pada data yang dihapus, meskipun ini bisa meningkat lebih tinggi seperlunya.
  • Karena overhead transaksional, DELETEbisa "lambat" (ini relatif), tetapi lebih aman karena berbutir halus.

TRUNCATE - BAHASA DEFINISI DATA (DDL)

TRUCNATEdianggap sebagai pernyataan DDL , artinya dimaksudkan untuk mengubah cara objek didefinisikan dalam database. Biasanya, pernyataan DDL adalah CREATE,, ALTERatau DROP, tetapi TRUNCATEmelayani tujuan tertentu, yaitu untuk "mengatur ulang" sebuah tabel dengan menghapus semua baris. Metode ini berbeda antara mesin RDBMS dan saya akan merekomendasikan melihat spesifik MySQL . Implikasi praktis dari a TRUNCATEadalah:

  • TRUNCATEtidak bisa berbutir halus. Jika berhasil, itu akan menghapus semua baris dari tabel Anda.
  • TRUNCATEbiasanya tidak dicatat. Ini bervariasi menurut RDBMS dan saya sarankan Anda melihat lebih spesifik bagaimana MySQL menanganinya. (Petunjuk, ini bervariasi menurut versi.)
  • TRUNCATEmembutuhkan kunci metadata tabel untuk dieksekusi. Bagaimana ini benar-benar diimplementasikan dapat spesifik untuk RDBMS, tetapi pada dasarnya TRUNCATEproses tersebut harus mencegah proses lain dari mucking dengan tabel untuk mengeksekusi DDL-nya.
  • Karena (biasanya) tidak dicatat dan tidak menggunakan predikat, a TRUNCATEakan lebih cepat daripada DELETE, tetapi kurang aman.

DROP TABLE - BAHASA DEFINISI DATA (DDL)

DROP TABLEmelangkah lebih jauh dari TRUNCATEpada yang benar-benar menghapus tabel dari database sepenuhnya. Ini termasuk menghapus semua objek terkait, seperti indeks dan batasan. Jika Anda menjatuhkan tabel, Anda tidak hanya akan menghapus semua data, tetapi struktur juga. Ini biasanya akan dilakukan ketika meja tidak lagi dibutuhkan. Perhatian utama adalah karena a DROPadalah DDL, Anda biasanya tidak dapat membatalkannya . Beberapa mesin RDBMS akan memungkinkan Anda untuk membungkus DDL dalam suatu transaksi sehingga Anda dapat mengembalikannya, tetapi ini tidak dianggap praktik terbaik dan harus dihindari.


1
Saya akan menambahkan bahwa TRUNCATE me-reset penghitung kenaikan-otomatis tabel.
DanMan

5

Meskipun saya tidak dapat berbicara untuk MySQL, berikut adalah tabel singkat yang membandingkan beberapa aspek dari truncate vs delete dalam 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                            |  

Informasi yang dihimpun dari buku ini: http://amzn.com/0470395125

Semoga ini dapat membantu setiap pengguna Oracle yang tersandung di halaman ini, seperti yang saya lakukan. Silakan tunjukkan yang mana, jika ada, dari poin-poin ini berlaku di MySQL,


2

DROP TABLE TableName -> hapus tabel dari database.

TRUNCATE TABLE TableName-> hapus data tabel, tanpa syarat ... dan setel ulang nilai IDENTITYseed, jika tabel memiliki IDENTITYbidang.


1
  • DELETE: Perintah DML, jika Anda melakukan perintah delete, hapus satu-satunya DATA tanpa menghilangkan struktur tabel, kita dapat MENGGULIRKAN baris data dengan cara baris

  • TRUNCATE: Perintah DDL, jika Anda menjalankan perintah Truncate, hapus satu-satunya DATA tanpa menghilangkan struktur tabel, kami tidak dapat mengembalikan truncate data, menghapus data dalam PAGE BY PAGE dengan cara truncate lebih cepat, lalu hapus query

  • DROP:, Perintah DDL, jika Anda melakukan perintah DROP itu menghapus (menghapus) data dan struktur tabel total juga kita tidak bisa mengembalikan data

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.