TRUNCATE TABLE (transact-SQL)

Berlaku untuk:yes SQL Server (semua versi yang didukung) YesAzure SQL Database YesAzure SQL Managed Instance yesAzure Synapse Analytics Analytics yesPlatform System (PDW)

Menghapus semua baris dari tabel atau partisi tabel tertentu, tanpa mencatat penghapusan baris individual. TRUNCATE TABLE mirip dengan pernyataan DELETE tanpa klausa WHERE; namun, TRUNCATE TABLE lebih cepat dan menggunakan lebih sedikit sistem dan sumber daya log transaksi.

Topic link iconKonvensi Sintaksis T-SQL

Sintaks

-- Syntax for SQL Server and Azure SQL Database  
  
TRUNCATE TABLE   
    { database_name.schema_name.table_name | schema_name.table_name | table_name }  
    [ WITH ( PARTITIONS ( { <partition_number_expression> | <range> }   
    [ , ...n ] ) ) ]  
[ ; ]  
  
<range> ::=  
<partition_number_expression> TO <partition_number_expression>  
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse  
  
TRUNCATE TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }  
[;]  

Catatan

Untuk melihat sintaks transact-SQL untuk SQL Server 2014 dan yang lebih lama, lihat Dokumentasi versi sebelumnya.

Argumen

database_name

Adalah nama database.

nama_skema

Adalah nama skema tempat tabel berada.

table_name

Adalah nama tabel yang akan dipotong atau dari mana semua baris dihapus. table_name harus harfiah. table_name tidak boleh fungsi OBJECT_ID() atau variabel.

WITH ( PARTISI ( { <partition_number_expression> | <Berbagai> } [ , ... n ] ) )

Berlaku untuk: SQL Server ( SQL Server 2016 (13.x) melalui versi saat ini)

Menentukan partisi yang akan dipotong atau dari mana semua baris dihapus. Jika tabel tidak dipartisi, WITH PARTITIONS argumen akan menghasilkan kesalahan. WITH PARTITIONS Jika klausa tidak disediakan, seluruh tabel akan terpotong.

<>partition_number_expression dapat ditentukan dengan cara berikut:

  • Berikan jumlah partisi, misalnya: WITH (PARTITIONS (2))

  • Berikan nomor partisi untuk beberapa partisi individual yang dipisahkan oleh koma, misalnya: WITH (PARTITIONS (1, 5))

  • Berikan rentang dan partisi individual, misalnya: WITH (PARTITIONS (2, 4, 6 TO 8))

  • <rentang> dapat ditentukan sebagai nomor partisi yang dipisahkan oleh kata TO, misalnya: WITH (PARTITIONS (6 TO 8))

Untuk memotong tabel yang dipartisi, tabel dan indeks harus diratakan (dipartisi pada fungsi partisi yang sama).

Keterangan

Dibandingkan dengan pernyataan DELETE, TRUNCATE TABLE memiliki keuntungan berikut:

  • Lebih sedikit ruang log transaksi yang digunakan.

    Pernyataan DELETE menghapus baris satu per satu dan merekam entri dalam log transaksi untuk setiap baris yang dihapus. TRUNCATE TABLE menghapus data dengan membatalkan alokasi halaman data yang digunakan untuk menyimpan data tabel dan hanya merekam dealokasi halaman dalam log transaksi.

  • Lebih sedikit kunci yang biasanya digunakan.

    Saat pernyataan DELETE dijalankan menggunakan kunci baris, setiap baris dalam tabel dikunci untuk dihapus. TRUNCATE TABLE selalu mengunci tabel (termasuk kunci skema (SCH-M) dan halaman tetapi tidak setiap baris.

  • Tanpa pengecualian, nol halaman dibiarkan dalam tabel.

    Setelah pernyataan DELETE dijalankan, tabel masih bisa berisi halaman kosong. Misalnya, halaman kosong dalam timbunan tidak dapat dibatalkan alokasinya tanpa setidaknya kunci tabel eksklusif (LCK_M_X). Jika operasi penghapusan tidak menggunakan kunci tabel, tabel (heap) akan berisi banyak halaman kosong. Untuk indeks, operasi penghapusan dapat meninggalkan halaman kosong, meskipun halaman ini akan dibatalkan alokasinya dengan cepat oleh proses pembersihan latar belakang.

TRUNCATE TABLE menghapus semua baris dari tabel, tetapi struktur tabel dan kolom, batasan, indeks, dan sebagainya tetap ada. Untuk menghapus definisi tabel selain datanya, gunakan DROP TABLE pernyataan .

Jika tabel berisi kolom identitas, penghitung untuk kolom tersebut diatur ulang ke nilai nilai awal yang ditentukan untuk kolom. Jika tidak ada nilai awal yang ditentukan, nilai default 1 akan digunakan. Untuk mempertahankan penghitung identitas, gunakan DELETE sebagai gantinya.

Catatan

Operasi TRUNCATE TABLE dapat digulung balik.

Batasan

Anda tidak dapat menggunakan TRUNCATE TABLE pada tabel yang:

  • Dirujuk oleh batasan KUNCI ASING. Anda dapat memotong tabel yang memiliki kunci asing yang mereferensikan itu sendiri.

  • Berpartisipasi dalam tampilan terindeks.

  • Diterbitkan dengan menggunakan replikasi transaksional atau replikasi penggabungan.

  • Apakah temporal versi sistem.

  • Dirujuk oleh batasan EDGE.

Untuk tabel dengan satu atau beberapa karakteristik ini, gunakan pernyataan DELETE sebagai gantinya.

TRUNCATE TABLE tidak dapat mengaktifkan pemicu karena operasi tidak mencatat penghapusan baris individual. Untuk informasi selengkapnya, lihat CREATE TRIGGER (Transact-SQL).

Di Azure Synapse Analytics and Analytics Platform System (PDW):

  • TRUNCATE TABLE tidak diizinkan dalam pernyataan EXPLAIN.

  • TRUNCATE TABLE tidak dapat dijalankan di dalam transaksi.

Memotong Tabel Besar

Microsoft SQL Server memiliki kemampuan untuk menjatuhkan atau memotong tabel yang memiliki lebih dari 128 ekstensi tanpa memegang kunci simultan pada semua tingkat yang diperlukan untuk penurunan.

Izin

Izin minimum yang diperlukan adalah ALTER pada table_name. TRUNCATE TABLE izin default ke pemilik tabel, anggota sysadmin peran server tetap, dan db_owner peran database tetap, db_ddladmin dan tidak dapat ditransfer. Namun, Anda dapat menggabungkan TRUNCATE TABLE pernyataan dalam modul, seperti prosedur tersimpan, dan memberikan izin yang sesuai ke modul menggunakan EXECUTE AS klausul .

Contoh

A. Memotong Tabel

Contoh berikut menghapus semua data dari JobCandidate tabel. SELECT pernyataan disertakan sebelum dan sesudah pernyataan untuk membandingkan TRUNCATE TABLE hasil.

USE AdventureWorks2012;  
GO  
SELECT COUNT(*) AS BeforeTruncateCount   
FROM HumanResources.JobCandidate;  
GO  
TRUNCATE TABLE HumanResources.JobCandidate;  
GO  
SELECT COUNT(*) AS AfterTruncateCount   
FROM HumanResources.JobCandidate;  
GO  

B. Potong Partisi Tabel

Berlaku untuk: SQL Server ( SQL Server 2016 (13.x) melalui versi saat ini)

Contoh berikut memotong partisi tertentu dari tabel yang dipartisi. Sintaks WITH (PARTITIONS (2, 4, 6 TO 8)) menyebabkan nomor partisi 2, 4, 6, 7, dan 8 terpotong.

TRUNCATE TABLE PartitionTable1   
WITH (PARTITIONS (2, 4, 6 TO 8));  
GO  

Lihat juga

DELETE (Transact-SQL)
DROP TABLE (Transact-SQL)
IDENTITY (Properti) (SQL Bertransaksi)