POTONG TABEL (Transact-SQL)
Berlaku untuk: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Warehouse di Microsoft Fabric
Menghapus semua baris dari tabel atau partisi tabel tertentu, tanpa mencatat penghapusan baris individual. TRUNCATE TABLE
mirip DELETE
dengan pernyataan tanpa WHERE
klausul; namun, TRUNCATE TABLE
lebih cepat dan menggunakan lebih sedikit sistem dan sumber daya log transaksi.
Sintaks
Sintaks untuk SQL Server dan 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>
Sintaks untuk Microsoft Fabric, Azure Synapse Analytics, dan Gudang Data Paralel.
TRUNCATE TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
[ ; ]
Argumen
database_name
Nama database.
schema_name
Nama skema tempat tabel berada.
table_name
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 | <>range> } [ , ... n ] ) )
Berlaku untuk: SQL Server 2016 (13.x) dan versi yang lebih baru.
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 dipotong.
<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))
<range>
dapat ditentukan sebagai nomor partisi yang dipisahkan oleh kataTO
, misalnya:WITH (PARTITIONS (6 TO 8))
Untuk memotong tabel yang dipartisi, tabel dan indeks harus diratakan (dipartisi pada fungsi partisi yang sama).
Keterangan
Dibandingkan DELETE
dengan pernyataan, TRUNCATE TABLE
memiliki keuntungan berikut:
Ruang log transaksi yang digunakan lebih sedikit.
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 alokasi halaman dalam log transaksi.Kunci yang digunakan biasanya lebih sedikit.
DELETE
Saat pernyataan 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.
DELETE
Setelah pernyataan dijalankan, tabel masih dapat 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 (tumpukan) akan berisi banyak halaman kosong. Untuk indeks, operasi penghapusan dapat meninggalkan halaman kosong, meskipun proses pembersihan latar belakang membatalkan alokasi halaman ini dengan cepat.
TRUNCATE TABLE
menghapus semua baris dari tabel, tetapi struktur tabel dan kolomnya, 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 awal yang ditentukan untuk kolom. Jika tidak ada seed yang ditentukan, nilai 1
default akan digunakan. Untuk mempertahankan penghitung identitas, gunakan DELETE
sebagai gantinya.
TRUNCATE TABLE
Operasi dapat digulung balik dalam transaksi.
Batasan
Anda tidak dapat menggunakan TRUNCATE TABLE
pada tabel yang:
Dirujuk oleh
FOREIGN KEY
batasan. Anda dapat memotong tabel yang memiliki kunci asing yang merujuk dirinya sendiri.Berpartisipasi dalam tampilan terindeks.
Diterbitkan dengan menggunakan replikasi transaksional atau replikasi penggabungan.
Berversi sistem sementara.
Dirujuk oleh
EDGE
batasan.
Untuk tabel dengan satu atau beberapa karakteristik ini, gunakan pernyataan sebagai gantinya DELETE
.
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 dalamEXPLAIN
pernyataan.TRUNCATE TABLE
tidak dapat dijalankan di dalam transaksi.
Memotong tabel besar
Microsoft SQL Server memiliki kemampuan untuk menghilangkan atau memotong tabel yang memiliki lebih dari 128 jangkauan tanpa memegang kunci simultan pada semua tingkat yang diperlukan untuk penghilangan.
Izin
Izin minimum yang diperlukan ada ALTER
di table_name. TRUNCATE TABLE
izin default ke pemilik tabel, anggota peran server tetap sysadmin , dan db_owner
peran database tetap dan db_ddladmin , dan tidak dapat ditransfer. Namun, Anda dapat memasukkan pernyataan TRUNCATE TABLE
di dalam modul, seperti prosedur tersimpan, dan memberikan izin yang sesuai ke modul menggunakan klausul EXECUTE AS
.
Contoh
J. Memotong tabel
Contoh berikut menghapus semua data dari JobCandidate
tabel. SELECT
pernyataan disertakan sebelum dan sesudah pernyataan untuk membandingkan TRUNCATE TABLE
hasil.
USE AdventureWorks2022;
GO
SELECT COUNT(*) AS BeforeTruncateCount
FROM HumanResources.JobCandidate;
GO
TRUNCATE TABLE HumanResources.JobCandidate;
GO
SELECT COUNT(*) AS AfterTruncateCount
FROM HumanResources.JobCandidate;
GO
B. Memotong partisi tabel
Berlaku untuk: SQL Server 2016 (13.x) dan versi yang lebih baru.
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 dipotong.
TRUNCATE TABLE PartitionTable1
WITH (PARTITIONS (2, 4, 6 TO 8));
GO
C. Mengembalikan operasi pemotongan
Contoh berikut menunjukkan bahwa TRUNCATE TABLE
operasi di dalam transaksi dapat digulung balik.
Buat tabel pengujian dengan tiga baris.
USE [tempdb]; GO CREATE TABLE TruncateTest (ID INT IDENTITY (1, 1) NOT NULL); GO INSERT INTO TruncateTest DEFAULT VALUES; GO 3
Periksa data sebelum memotong.
SELECT * FROM TruncateTest; GO
Potong tabel dalam transaksi, dan periksa jumlah baris.
BEGIN TRANSACTION; TRUNCATE TABLE TruncateTest; SELECT * FROM TruncateTest;
Anda melihat bahwa tabel kosong.
Gulung balik transaksi dan periksa data.
ROLLBACK TRANSACTION; GO SELECT * FROM TruncateTest; GO
Anda melihat ketiga baris.
Bersihkan meja.
DROP TABLE TruncateTest; GO