SQL'de TRUNCATE ve DELETE arasındaki fark nedir


303

Arasındaki fark nedir TRUNCATEve DELETESQL?

Cevabınız platforma özgü ise, lütfen bunu belirtin.


4
Tüm cevaplar platforma özgüdür. Standart SQL'de TRUNCATE komutu yoktur. Bu nedenle tescilli bir özelliktir ve her DBMS satıcısı için farklı bir şey ifade eder.
nvogel

Yanıt çok uygulamaya özgüdür, çünkü olması gerektiği gibi, sqlvogel'in belirttiği gibi, bu standart olmayan bir komuttur (TRUNCATE). Ya bu etiketli 'kehanet' bırakın ya da bir topluluk-wiki tarzı cevap yapalım ve her büyük RDBMS için sonuçları ortaya koyalım (Oracle, MS-MSQL, PostgreSQL hepsi TRUNCATE uygular ...)
reedstrm

İşlem tamamlandıysa, COMMITED anlamına gelir, o zaman TRUNCATE komutunu geri alamayız, ancak yine de DELETE komutunu LOG ​​dosyalarından geri alabiliriz, çünkü DELETE yazma, ileride LOG dosyalarından geri alınması gerektiğinde bunları Log dosyasına kaydeder.

Yanıtlar:


272

İşte farklılıkların bir listesi. Oracle'a özgü özellikleri vurguladım ve umarım topluluk diğer satıcıların özel farklarını da ekleyebilir. Çoğu satıcı için ortak olan farklılıklar, aşağıda vurgulanan farklılıklar ile doğrudan başlıkların altına inebilir.


Genel Bakış

Bir tablodaki tüm satırları hızlı bir şekilde silmek istiyorsanız ve bunu yapmak istediğinizden gerçekten eminseniz ve tablolara karşı yabancı anahtarlarınız yoksa, bir TRUNCATE muhtemelen bir DELETE'den daha hızlı olacaktır. .

Aşağıda ayrıntılı olarak açıklandığı gibi, sisteme özgü çeşitli hususlar dikkate alınmalıdır.


İfade türü

Silme DML, Kesme DDL ( DDL ve DML nedir? )


Taahhüt ve Geri Alma

Satıcıya göre değişken

SQL Server

Kesme geri alınabilir.

PostgreSQL

Kesme geri alınabilir.

torpil

TRUNCATE DDL olduğu için, ifadenin yürütülmesinden önce ve sonra iki taahhüt içerir. Bu nedenle, kesme kesilemez ve kesme işlemindeki bir başarısızlık yine de bir taahhüt vermiş olacaktır.

Ancak, aşağıdaki Flashback'e bakın.


Alan geri kazanımı

Sil alanı kurtarmaz, Kes alanı kurtarır

torpil

REUSE STORAGE yantümcesini kullanırsanız, veri bölümleri ayrılmaz, bu da tablo verilerle yeniden yüklenecekse marjinal olarak daha verimli olabilir. Yüksek su işareti sıfırlanır.


Satır kapsamı

Sil, tüm satırları veya yalnızca bir satır alt kümesini kaldırmak için kullanılabilir. Kes, tüm satırları kaldırır.

torpil

Bir tablo bölümlendiğinde, ayrı bölümler ayrı ayrı kesilebilir, böylece tüm tablo verilerinin kısmen kaldırılması mümkündür.


Nesne türleri

Sil, bir kümedeki tablolara ve tablolara uygulanabilir. Kesme yalnızca tablolar veya kümenin tamamı için geçerlidir. (Oracle'a özgü olabilir)


Veri Nesnesi Kimliği

torpil

Sil, veri nesnesi kimliğini etkilemez, ancak kesildi , oluşturulduğundan bu yana tabloya karşı hiçbir ekleme yapılmadığı sürece yeni bir veri nesnesi kimliği atar. Geri alınan tek bir ekleme bile kesme işleminden sonra yeni bir veri nesnesi kimliğinin atanmasına neden olur .


Flashback (Oracle)

Flashback silmeler arasında çalışır, ancak bir kesme işlemi işlemden önce durumlara geri dönmeyi önler.

Bununla birlikte, 11gR2'den FLASHBACK ARCHIVE özelliği buna izin verir, Express Edition hariç

Oracle'da FLASHBACK kullanımı http://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_flashback.htm#ADFNS638


Ayrıcalıklar

Değişken

torpil

Silme, bir tabloya başka bir kullanıcıya veya role verilebilir, ancak kesilme, HERHANGİ BİR TABLO DROP'u kullanmadan yapılamaz.


Yeniden / Geri Al

Sil, az miktarda yineleme ve büyük miktarda geri alma işlemi üretir. Kesme, her biri ihmal edilebilir bir miktarda üretir.


endeksleri

torpil

Kesme işlemi, kullanılamayan dizinleri yeniden kullanılabilir hale getirir. Silme yapmaz.


Yabancı anahtarlar

Etkinleştirilmiş bir yabancı anahtar tabloya başvurduğunda kesme uygulanamaz. Silme işlemi, yabancı anahtarların yapılandırmasına bağlıdır.


Masa Kilitleme

torpil

Kesme özel bir tablo kilidi gerektirir, silme paylaşılan bir tablo kilidi gerektirir. Bu nedenle tablo kilitlerinin devre dışı bırakılması, bir tablodaki kesme işlemlerini önlemenin bir yoludur.


tetikleyiciler

DML tetikleyicileri kesik kesilmez.

torpil

DDL tetikleyicileri mevcuttur.


Uzaktan Yürütme

torpil

Bir veritabanı bağlantısı üzerinden kesme yapılamaz.


Kimlik Sütunları

SQL Server

Kes, IDENTITY sütun türleri için diziyi sıfırlar, silemez.


Sonuç kümesi

Çoğu uygulamada, bir DELETEifade silinen satırları istemciye döndürebilir.

örneğin bir Oracle PL / SQL alt programında şunları yapabilirsiniz:

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

4. ifadenizi anlamayın: Tablodan DELETE [ ] dersem ; ardından * bir FK durdurmadığı sürece bu tablodaki tüm satırlar silinir. Bu arada, bu SQL Server'a özgüdür, TRUNCATE'i FK'lı tablolarda kullanamazsınız.
Joe Pineda

Bazı yorumlar: Oracle'a özgü olmadıkça 3. ifadenize katılmıyorum. En azından SQL S. ile, SİL veya TRUNCATE yaparsanız, özellikle istemediğiniz sürece alanı kurtarmazsınız (yani veritabanı dosyaları sabit sürücüde küçülmez).
Joe Pineda

1
5th Bildirimi: sql 2008
r2'de

1
Postgresql bir TRUNCATE i geri alabilir ve böylece otomatik olarak devreye girmez.
rfusca

5
DELETE, silinen satır sayısını döndürür, ancak TRUNCATE döndürmez. Çok aptalca bir nokta ama bahsetmeye değer :)
Deepak Kumar Jha

192

Kesme ve silme arasındaki fark aşağıda listelenmiştir:

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

Tablonun sıfırlama kimliğini kısaltmak Bu ne anlama geliyor? Peki Sil'e ne dersiniz?
Ravi

1
@jWeaver: Birincil anahtar alanı için Kimlik Belirtimi özelliğini True olarak ayarladığınızda, bu tabloya veri eklediğinizde birincil anahtar sütunu 1,2,3,4,5 .... gibi bir değer tutar (Kimlik başlarsa) 1 ve tohum 1'dir) ve tabloyu kırptığınızda tüm kimlik değeri kaybolur, bu nedenle bu tabloya tekrar veri eklemeye başladığınızda, son kaldığı yer yerine 1'den başlar. DELETE içinde, tersi, DELETE deyimini yürüttükten sonra bile kimlik değerini korur. Yukarıdaki resimde DELETE sütununda 2. karşılaştırma noktası hatası için özür dileriz.
Bhaumik Patel

Sizin için yanıtlama gibi görünüyor SQL SERVER
Ravi

4
Hem TRUNCATE hem de DELETE, SQL SERVER ile geri alınabilir . Ve 2. satırda DELETE dozu kimliği sıfırlamaz. Şimdi bu yayını nasıl düzenleyebilirsiniz? StackOverflow'da resimleri kullanmanın kötü yanı budur.
Mahmood Jenami

2
Kesme geri alınıyor! (SQL SUNUCUSU)
Aimal Khan

55

DÜŞÜRMEK

DROP komutu veritabanından bir tabloyu kaldırır. Tüm tabloların satırları, dizinleri ve ayrıcalıkları da kaldırılacaktır. Hiçbir DML tetikleyicisi tetiklenmez. İşlem geri alınamaz.

KESILMESINDEN

TRUNCATE bir tablodaki tüm satırları kaldırır. İşlem geri alınamaz ve tetikleyici tetiklenmez. Bu nedenle, TRUNCATE daha hızlıdır ve DELETE kadar alanı geri almaz. Kesme sırasında tablo seviyesi kilidi eklenecektir.

SİL

DELETE komutu tablodaki satırları kaldırmak için kullanılır. WHERE deyimi yalnızca bazı satırları kaldırmak için kullanılabilir. WHERE koşulu belirtilmezse, tüm satırlar kaldırılır. Bir SİL işlemi gerçekleştirdikten sonra, değişikliği kalıcı hale getirmek veya geri almak için işlemi DEVREYE ALMALI veya GERİ ALMALISINIZ Bu işlemin, tablodaki tüm DELETE tetikleyicilerinin tetiklenmesine neden olacağını unutmayın. Silme işlemi sırasında satır seviyesi kilidi eklenir.

Gönderen: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands


5
Benim gibi yeni başlayanlar için güzel bir açıklama
Vikas Kukreti

Kısa ve tatlı
ABH

23

Eklemem gereken tüm iyi cevaplar:

Yana TRUNCATE TABLEbir DDL (olan Veri Tanımı Dili ), bir DML ( veri düzenleme Langauge ) komutu, Delete Triggerskoşma.


Ah, tetikler ... bu iyi bir nokta. Bunu yaptığım listeye ekleyeceğim ve size sorun varsa Polara'ya kredi vereceğim.
David Aldridge

SQL Server bir tabloyu yabancı anahtarlarla kısaltmanıza izin vermez, bu nedenle platforma bağlı olarak basamaklı noktanız tartışmalı olabilir.
Meff

PostgreSQL'in bir "TRUNCATE Tetikleyicisi" var
a_horse_with_no_name


17

SQL Server veya MySQL ile, otomatik artışlı bir PK varsa, kesme sayacı sıfırlar.


Açıklığa kavuşturmak için, tablonun KİMLİK olarak tanımlanan bir sütunu varsa SQL Server içindir. Sil otomatik olarak atanan son kimliği korurken, Truncate sayacı sıfırlar.
Codewerks

Soru ORACLE olarak etiketlendiğinden, bu cevap YANLIŞ, bu nedenle aşağı indirildi.
Guy

ayy, oracle etiketini görmedim :)
mathieu

+1 true değerini sıfırlar ve 0'a sıfırlar . Bunun yerine 1 olmasını istiyorsanız :DBCC CHECKIDENT (table_name, RESEED, 1)
JohnB

Bunu topluluk yanıtına ekledim ve satıcıya özgü sorunları belgelemek için biraz daha kolay hale getirdim
David Aldridge

12

"Kesme hiçbir şey kaydetmiyor" doğrudur. Daha ileri giderdim:

Kesme işlemi bir işlem bağlamında yürütülmez.

Kesmenin silinmeye karşı hız avantajı açık olmalıdır. Bu avantaj, durumunuza bağlı olarak önemsizden devasa düzeylere kadar değişir.

Ancak, kesilmenin kasıtsız olarak referans bütünlüğünü bozduğunu ve diğer kısıtlamaları ihlal ettiğini gördüm. Bir işlemin dışındaki verileri değiştirerek elde ettiğiniz güç, ip olmadan ağda yürüdüğünüzde aldığınız sorumluluğa karşı dengelenmelidir.


7

TRUNCATEDDL ifadesidir, DELETEDML ifadesidir. İkisi arasındaki farklar aşağıdadır:

  1. Gibi TRUNCATEbir DDL (olan veri tanımlama dili ) ifadesi bu kalıcı değişiklikler yapmak için taahhüt gerektirmez. Ve bu, truncate tarafından silinen satırların geri alınamama nedenidir. Öte yandan DELETEbir DML ( Veri düzenleme dili ) ifadesi bu nedenle etkisini kalıcı hale getirmek için açık bir taahhüt gerektirir.

  2. TRUNCATEher zaman bir tablodan tüm satırları kaldırır ve tablo boş bırakılır ve tablo yapısı bozulmaz; oysa DELETE, nerede cümlesi kullanılırsa koşullu olarak kaldırılabilir.

  3. İfadeyle silinen satırlar TRUNCATE TABLEgeri yüklenemez ve TRUNCATEifadede where yan tümcesini belirtemezsiniz .

  4. TRUNCATEüzerinde silme tetikte ait aksine ifadeleri tetikleyiciler ateş etmiyor DELETEaçıklamada

İşte konuyla ilgili çok iyi bir bağlantı.


6

Evet, DELETE daha yavaş, TRUNCATE daha hızlı. Neden?

DELETE kayıtları okumalı, kısıtlamaları kontrol etmeli, bloğu güncellemeli, dizinleri güncellemeli ve yineleme / geri alma üretmelidir. Bütün bunlar zaman alır.

TRUNCATE, tablodaki (High Water Mark) ve puf için veritabanında bir işaretçi ayarlar! veriler kayboldu.

Bu Oracle'a özgü AFAIK.


PostgreSQL de buna benzer.
Gavin M.Roy

6

KESILMESINDEN

TRUNCATE SQL sorgusu, tek tek satır silme işlemlerini kaydetmeden tablodaki tüm satırları kaldırır.

  • TRUNCATE bir DDL komutudur.
  • TRUNCATE, bir tablo kilidi kullanılarak yürütülür ve tüm kayıtları kaldırmak için tüm tablo kilitlenir.
  • TRUNCATE ile WHERE yan tümcesini kullanamayız.
  • TRUNCATE bir tablodaki tüm satırları kaldırır.
  • İşlem günlüğünde en az günlük kaydı olduğundan, performans açısından daha hızlıdır.
  • TRUNCATE TABLE, tablo verilerini depolamak için kullanılan veri sayfalarını ayırarak verileri kaldırır ve yalnızca işlem günlüğüne yalnızca sayfa ayırmalarını kaydeder.
  • Truncate'ı bir tablo üzerinde kullanmak için, tablo üzerinde en az ALTER iznine ihtiyacınız vardır.
  • Truncate, Delete ifadesinden daha az işlem alanı kullanır.
  • Kesme, dizine alınmış görünümlerle kullanılamaz.
  • TRUNCATE, DELETE'den daha hızlı.

SİL

Bir DELETE kuyruğunu yürütmek için hedef tabloda silme izinleri gerekir. DELETE içinde bir WHERE yan tümcesi kullanmanız gerekiyorsa, belirli izinler de gerekir.

  • DELETE bir DML komutudur.
  • DELETE bir satır kilidi kullanılarak yürütülür, tablodaki her satır silinmek üzere kilitlenir.
  • Belirli kayıtları filtrelemek ve silmek için DELETE ile where yan tümcesini kullanabiliriz.
  • DELETE komutu, WHERE koşuluna göre bir tablodaki satırları kaldırmak için kullanılır.
  • Günlüğü tutar, böylece TRUNCATE'ten daha yavaştır.
  • DELETE deyimi satırları birer birer kaldırır ve silinen her satır için işlem günlüğüne bir girdi kaydeder.
  • DELETE sütunu keep kimliğinin kimliğini korur.
  • Sil'i kullanmak için, tabloda SİL iznine ihtiyacınız vardır.
  • Delete, Truncate ifadesinden daha fazla işlem alanı kullanır.
  • Sil, dizinlenmiş görünümlerle kullanılabilir.

5

Yanlışlıkla Sil / Kes'i kullanarak tablodaki tüm verileri kaldırdınız. Taahhütlü işlemi geri alabilirsiniz. Son yedeklemeyi geri yükleyin ve Sil / Kısalt'ın gerçekleşeceği zamana kadar işlem günlüğünü çalıştırın.

Aşağıdaki ilgili bilgiler bir blog yayınından alınmıştır :

Veritabanı üzerinde çalışırken, aralarındaki farkları bilmeden Delete ve Truncate'i kullanıyoruz. Bu yazıda, Sql'de Delete ve Truncate arasındaki farkı tartışacağız.

Sil:

  • Sil bir DML komutudur.
  • Delete ifadesi bir satır kilidi kullanılarak yürütülür, tablodaki her satır silinmek üzere kilitlenir.
  • Nerede cümlede filtreler belirtebiliriz.
  • Koşulun mevcut olması durumunda belirtilen verileri siler.
  • İşlem tek tek günlüğe kaydedildiğinden, tetikleyici etkinlikleri silin.
  • Günlükleri Tutar çünkü Kesikten Daha Yavaş

truncate

  • Kesme bir DDL komutudur.
  • Tabloyu kes her zaman tabloyu ve sayfayı kilitler, ancak her satırı kilitlemez. Tüm verileri kaldırdığı için.
  • Where koşulu kullanılamaz.
  • Tüm verileri kaldırır.
  • İşlem tek tek satır silme işlemlerini kaydetmediğinden kesme tablosu tetikleyiciyi etkinleştiremiyor.
  • Performans açısından daha hızlı, çünkü hiçbir kayıt tutmuyor.

Not: Silme ve Kesme, İşlemle birlikte kullanıldığında geri alınabilir. İşlem tamamlanmışsa, anlamına gelir, o zaman Kes komutunu geri alamayız, ancak yine de silme komutunu Günlük dosyalarından geri alabiliriz.

Kesmeye çalıştığınız tabloya ilişkin Yabancı anahtar kısıtlamanız varsa, başvuru tablosunda veri bulunmasa bile bu çalışmaz. Bunun nedeni, yabancı anahtar denetiminin DML yerine DDL ile yapılmasıdır. Bu, tablodaki yabancı anahtar kısıtlamalarını geçici olarak devre dışı bırakarak çözülebilir.

Tabloyu sil, kaydedilmiş bir işlemdir. Böylece her satırın silinmesi işlem günlüğüne kaydedilir, bu da onu yavaşlatır. Tabloyu kes, tablodaki tüm satırları da siler, ancak her satırın silinmesini günlüğe kaydetmez, bunun yerine tablonun veri sayfalarının yeniden konumlandırılmasını günlüğe kaydeder, bu da onu daha hızlı hale getirir.

~ Yanlışlıkla Sil / Kes kullanarak tablodaki tüm verileri kaldırdınız. Taahhütlü işlemi geri alabilirsiniz. Son yedeklemeyi geri yükleyin ve Sil / Kısalt'ın gerçekleşeceği zamana kadar işlem günlüğünü çalıştırın.


1
Thank @Lucas: İçeriği sıraladı. Bir fark kaynağından geldiğini açıkça göstermek için bir blok alıntıya koydum.
AstroCB

4

SQL Server 2005'te bir kısaltmayı geri alabileceğinize inanıyorum


4

SİL

DELETE komutu tablodaki satırları kaldırmak için kullanılır. WHERE deyimi yalnızca bazı satırları kaldırmak için kullanılabilir. WHERE koşulu belirtilmezse, tüm satırlar kaldırılır. Bir SİL işlemi gerçekleştirdikten sonra, değişikliği kalıcı hale getirmek veya geri almak için işlemi DEVREYE ALMALI veya GERİ ALMALISINIZ Bu işlemin, tablodaki tüm DELETE tetikleyicilerinin tetiklenmesine neden olacağını unutmayın.

KESILMESINDEN

TRUNCATE bir tablodaki tüm satırları kaldırır. İşlem geri alınamaz ve tetikleyici tetiklenmez. Bu nedenle, TRUCATE daha hızlıdır ve DELETE kadar alanı geri almaz.

DÜŞÜRMEK

DROP komutu veritabanından bir tabloyu kaldırır. Tüm tabloların satırları, dizinleri ve ayrıcalıkları da kaldırılacaktır. Hiçbir DML tetikleyicisi tetiklenmez. İşlem geri alınamaz.


DROP ve TRUNCATE DDL komutlarıdır, oysa DELETE bir DML komutudur. Bu nedenle, DELETE işlemleri geri alınabilir (geri alınabilir), DROP ve TRUNCATE işlemleri geri alınamaz.

Gönderen: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands


Bu mevcut cevaplara bir şey ekliyor mu?
David Aldridge

3

TRUNCATE, bir işleme sarılırsa geri alınabilir.

Lütfen aşağıdaki iki referansa bakın ve kendinizi test edin: -

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, SQL röportajları sırasında rezil sorulardan biridir. Sadece bunu Mülakatçıya doğru bir şekilde açıkladığınızdan emin olun, aksi takdirde işiniz size mal olabilir. Sorun, pek çok kişinin farkında olmamalarıdır, bu nedenle, YES Truncate'in geri alınabileceğini söylerseniz, cevabı yanlış olarak düşünürler.


2

Orijinal yanıt silme işleminde yapılan küçük bir düzeltme de önemli miktarda yineleme sağlar (geri alma işleminin kendisi yineleme ile korunduğu için). Bu, otomatik izleme çıktısından görülebilir:

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

eski iş parçacığı ancak benim anlayışım kesilme göre sadece silme geri alma ve her ikisini de yeniden üretir günlük yeniden iyi miktarda üretmek.
Saurabh Sinha

2

İşte SQL Server'da DELETE ve TRUNCATE arasındaki fark hakkındaki ayrıntılı cevabım

Verileri Kaldır : İlk önce, her ikisi de satırları tablodan kaldırmak için kullanılabilir.
Ancak DELETE, satırları yalnızca bir Tablodan değil, aynı zamanda bir GÖRÜNÜM'den veya sağlayıcı yeteneklerine tabi bir OPENROWSET veya OPENQUERY sonucundan kaldırmak için kullanılabilir.

FROM Yan tümcesi : DELETE ile başka bir FROM yan tümcesi kullanarak başka bir tablodaki satırlara dayalı olarak bir tablo / görünüm / rowset_function_limited satırlarını da silebilirsiniz. Bu FROM yan tümcesinde normal JOIN koşullarını da yazabilirsiniz. Aslında, SELECT yerine DELETE yazıp sütun adlarını kaldırarak hiçbir toplama işlevi içermeyen bir SELECT ifadesinden bir DELETE ifadesi oluşturabilirsiniz.
TRUNCATE ile bunu yapamazsınız.

NEREDE : BİR TRUNCATE'in NEREDE Koşulları olamaz, ancak bir DELETE olabilir. Bu, TRUNCATE ile belirli bir satırı veya belirli bir grup grubunu silemeyeceğiniz anlamına gelir. TRUNCATE TABLE, WHERE deyimi olmayan DELETE deyimine benzer.

Performans : TRUNCATE TABLE daha hızlıdır ve daha az sistem ve işlem günlüğü kaynağı kullanır. Bunun nedenlerinden biri, her iki ifade tarafından kullanılan kilitlerdir. DELETE deyimi bir satır kilidi kullanılarak yürütülür, tablodaki her satır silinmek üzere kilitlenir. TRUNCATE TABLE her zaman tablo ve sayfayı kilitler, ancak her satırı kilitlemez.

İşlem günlüğü : DELETE deyimi satırları birer birer kaldırır ve her satır için işlem günlüğünde tek tek girişler yapar.
TRUNCATE TABLE, tablo verilerini depolamak için kullanılan veri sayfalarını ayırarak verileri kaldırır ve yalnızca işlem günlüğüne yalnızca sayfa ayırmalarını kaydeder.

Sayfalar : DELETE deyimi yürütüldükten sonra tablo yine de boş sayfalar içerebilir. TRUNCATE, tablo verilerini depolamak için kullanılan veri sayfalarını ayırarak verileri kaldırır.

Tetikleyici : TRUNCATE, tablodaki silme tetikleyicilerini etkinleştirmez. TRUNCATE'i kullanırken çok dikkatli olmalısınız. Satırlar silindiğinde bazı otomatik temizleme veya günlüğe kaydetme eylemi yapmak için silme tetikleyicisi tanımlanmışsa, asla TRUNCATE kullanılmamalıdır.

Kimlik Sütunu : Tablo bir kimlik sütunu içeriyorsa TRUNCATE ile, bu sütunun sayacı sütun için tanımlanan tohum değerine sıfırlanır. Hiçbir tohum tanımlanmamışsa, varsayılan değer 1 kullanılır. DELETE kimlik sayacını sıfırlamaz. Bu nedenle, kimlik sayacını korumak istiyorsanız, bunun yerine DELETE kullanın.

Çoğaltma : DELETE, işlem çoğaltmasında veya birleştirme çoğaltmasında kullanılan tabloya karşı kullanılabilir.
TRUNCATE, işlem çoğaltması veya birleştirme çoğaltmasıyla ilgili tablolara karşı kullanılamaz.

Geri alma : DELETE ifadesi geri alınabilir.
TRUNCATE, bir TRANSACTION bloğunun içine alındığı ve oturumun kapatılmadığı takdirde geri alınabilir. Oturum kapatıldıktan sonra TRUNCATE'i geri alamazsınız.

Kısıtlamalar : DELETE deyimi, bir tetikleyiciyi ihlal ederse veya FOREIGN KEY kısıtlaması olan başka bir tablodaki veriler tarafından başvurulan bir satırı kaldırmaya çalışırsa başarısız olabilir. DELETE birden çok satırı kaldırırsa ve kaldırılan satırlardan herhangi biri bir tetikleyiciyi veya kısıtlamayı ihlal ederse, ifade iptal edilir, bir hata döndürülür ve hiçbir satır kaldırılmaz.
Görünümde DELETE kullanılırsa, bu Görünüm Güncellenebilir bir görünüm olmalıdır. TRUNCATE, Dizinlenmiş görünümde kullanılan tabloya karşı kullanılamaz.
TRUNCATE, kendisine başvuran yabancı anahtar içeren bir tablo olmadığı sürece, bir FOREIGN KEY kısıtlaması tarafından başvurulan tabloya karşı kullanılamaz.


Merhaba Mangal - özellikle SQL * Server'a özgü sorunlar için cevap için teşekkürler. Bu noktaları kabul edilen Topluluk Wiki cevabı ile entegre edebileceğinizi düşünüyor musunuz?
David Aldridge

Evet, ama nasıl ve nerede? Üzgünüm, burada yeniyim.
Mangal Pardeshi

"Yani kimlik sayacını korumak istiyorsanız DELETE kullanın" kullanabilirsinizDECLARE @ai as bigint SET @ai =IDENT_CURRENT('tablename') TRUNCATE TABLE tablename DBCC checkident('tablename', RESEED, @ai)
mpag

1

En büyük fark, silme işlemi sırasında kesmenin günlüğe kaydedilmemiş işlem olmasıdır.

Basitçe, bir veritabanı çökmesi durumunda, truncate tarafından çalıştırılan verileri kurtaramayacağınız, ancak silme ile yapabileceğiniz anlamına gelir.

Daha fazla ayrıntı burada


1

Deyimi SİL: Bu komut, where yan tümcesinde verilen koşula bağlı olarak yalnızca tablodaki satırları siler veya herhangi bir koşul belirtilmemişse tablodaki tüm satırları siler. Ancak tabloyu içeren alanı boşaltmaz.

SQL DELETE deyiminin sözdizimi:

Table_name [WHERE koşulu] 'dan SİL;

TRUNCATE deyimi: Bu komut tablodaki tüm satırları silmek ve tabloyu içeren alanı boşaltmak için kullanılır.


1

SİL

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]

KESILMESINDEN

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]

Daha fazla bilgi için

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


1

İki işlemin diğer bir farkı, tablo bir kimlik sütunu içeriyorsa, bu sütun için sayaç TRUNCATE altında sıfırlanır 1 (veya sütun için tanımlanan tohum değerine). DELETE bu etkiye sahip değildir.


0

Kısacası, kesme hiçbir şey günlüğe kaydetmez (bu yüzden çok daha hızlıdır ancak geri alınamaz), ancak silme günlüğe kaydedilir (ve daha büyük bir işlemin parçası olabilir, geri dönüş vb.). Dev'deki bir tabloda istemediğiniz verileriniz varsa, işlem günlüğünü doldurma riski taşımadığınız için kısaltmak normalde daha iyidir


0

Kullanışlı olmasının en büyük nedeni, verileri milyonlarca satırlık bir tabloda yenilemeniz gerektiğinde, ancak yeniden oluşturmak istemediğiniz zamandır. "Sil *" sonsuza dek sürerken, Truncate'in performans etkisi göz ardı edilebilir.


0

Bir dblink üzerinden DDL yapılamaz.


0

Matthieu'nun gönderisine yorum yaparım, ancak temsilcim henüz yok ...

MySQL'de, otomatik artış sayacı kesme ile sıfırlanır, ancak silme ile sıfırlanmaz.


0

Bu kesme SQL Server'da bir şey günlüğe kaydetmez. truncate herhangi bir bilgi günlüğe kaydetmez, ancak TRUNCATE'i başlattığınız tablo için veri sayfasının yeniden ayrılmasını günlüğe kaydeder.

ve başlangıçta işlemi tanımlarsak kesilmiş kayıt geri alınabilir ve kesilmiş kaydı geri aldıktan sonra kurtarabiliriz. Ancak, kesilen işlemden sonra kesilen kayıtları işlem günlüğü yedeklemesinden kurtaramazsınız.


0

Kesmek burada exapmle geri alınabilir

begin Tran
delete from  Employee

select * from Employee
Rollback
select * from Employee

0

SQL'de Kes ve Sil, tablodan veri kaldırmak veya silmek için kullanılan iki komuttur. Doğada oldukça basit olmasına rağmen, her iki Sql komutu, kullanmadan önce ayrıntılara aşina olana kadar çok fazla sorun yaratabilir. Hatalı bir komut seçimi, çok yavaş bir işlem olabilir veya çok fazla verinin kaldırılması gerekiyorsa ve log segmenti yeterli değilse, log segmentini havaya uçurabilir. Bu nedenle SQL'de truncate ve delete komutunun ne zaman kullanılacağını bilmek önemlidir, ancak bunları kullanmadan önce Truncate ve Delete arasındaki Farkların farkında olmalısınız ve bunlara dayanarak, DELETE'nin kaldırmanın ne zaman daha iyi bir seçenek olduğunu öğrenebilmeliyiz tabloları temizlemek için veri veya TRUNCATE kullanılmalıdır.

Bakın kontrol buraya tıklayın


0

Bir TRUNCATE TABLE deyimi yayınlayarak, SQL Server'a herhangi bir günlük kaydı veya işlem gerçekleştirmeden tablodaki her kaydı silmesini bildiriyorsunuz.


0

TRETCATE deyimi herhangi bir şey gerektirmez ve tüm tabloyu siler, DELETE deyimi belirli kayıtları silmek için bir WHERE yan tümcesi olabilir. Önemlisi, TRETCATE deyimi değil, DELETE deyimi silinen tarihi günlüğe kaydeder.


0

Microsoft sql sunucusuna özgü bir fark daha, hangi kayıtların silindiğini izlemek deleteiçin outputdeyimi kullanabilirsiniz , örn:

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

Bunu ile yapamazsın truncate.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.