Jika Anda mendapatkan error “Msg 8115, Level 16 Arithmetic overflow error converting IDENTITY to data type… ” di SQL Server, mungkin karena Anda mencoba menyisipkan data ke dalam tabel saat IDENTITY
kolom telah mencapai batas tipe datanya.
Sebuah IDENTITY
kolom secara otomatis menambah nilai yang disisipkan dengan setiap baris baru. Jika nilai yang dimasukkan berada di luar rentang tipe data kolom, maka akan terjadi error di atas.
Contoh Kesalahan
Berikut ini contoh kode yang menghasilkan kesalahan:
INSERT INTO t1 VALUES ('Dog');
Hasil:
Msg 8115, Level 16, State 1, Line 1 Arithmetic overflow error converting IDENTITY to data type tinyint.
Dalam hal ini, IDENTITY
saya kolom menggunakan tinyint
tipe data, yang memiliki rentang 0 hingga 255. Kesalahan menyiratkan bahwa IDENTITY
kolom mencoba memasukkan nilai yang lebih tinggi dari 255.
Ini biasanya terjadi ketika kami telah memasukkan 255 baris ke dalam kolom, dan sekarang kami mencoba memasukkan baris ke 256.
Inilah tampilan tabel saya ketika saya memilih semua baris di mana IDENTITY
kolom lebih besar dari 250
:
SELECT * FROM t1
WHERE c1 > 250;
Hasil:
+------+------+ | c1 | c2 | |------+------| | 251 | Ant | | 252 | Cow | | 253 | Bat | | 254 | Duck | | 255 | Bull | +------+------+
Dalam hal ini, c1
adalah IDENTITY
saya kolom (yang kebetulan ketik tinyint
). Kita dapat melihat bahwa IDENTITY
sebelumnya telah menghasilkan 255
untuk kolom, dan nilai berikutnya yang mencoba untuk menyisipkan adalah 256
(dengan asumsi nilai kenaikan 1
dan tidak ada sisipan yang gagal sebelumnya). Ini akan menyebabkan kesalahan di atas, karena 256 berada di luar rentang tinyint
.
Masalah yang sama dapat terjadi dengan tipe data smallint
(nilai maksimum 32,767) atau int
(nilai maksimum 2.147.483.647). Itu juga bisa terjadi dengan bigint
jika Anda memasukkan cukup banyak baris (lebih dari 9.223.372.036.854.775.807).
Namun, IDENTITY
nilai tidak selalu cocok dengan jumlah baris yang disisipkan. Anda dapat menetapkan nilai benih saat membuat IDENTITY
kolom, dan Anda juga dapat mengatur nilai kenaikan. Oleh karena itu, Anda dapat dengan mudah mencapai batas atas jauh lebih awal daripada jumlah penyisipan yang dilakukan pada tabel, tergantung pada nilai seed dan increment.
Selain itu, menghapus baris dari tabel tidak akan menyetel ulang IDENTITY
nilai (meskipun memotong tabel tidak).
Oleh karena itu, Anda masih dapat mengalami kesalahan di atas meskipun jumlah baris dalam tabel jauh lebih sedikit daripada IDENTITY
tipe data kolom mungkin menyarankan.
Solusi
Salah satu solusinya adalah mengubah tipe data IDENTITY
kolom. Misalnya, jika smallint
, ubah ke int
. Atau jika sudah int
, ubah ke bigint
.
Solusi lain yang mungkin adalah menyetel ulang IDENTITY
benih ke nilai yang lebih rendah. Ini hanya akan berfungsi jika Anda telah menghapus banyak baris dari tabel, atau jika nilai benih asli jauh lebih tinggi dari 1
.
Misalnya, jika IDENTITY
kolom sudah menjadi int
, tetapi IDENTITY
benih dimulai pada katakanlah 2,000,000,000
, Anda dapat mengatur ulang IDENTITY
benih ke 1
, yang memungkinkan 2 miliar baris lagi dimasukkan.
Fungsi Bermanfaat
Berikut adalah beberapa fungsi yang dapat sangat membantu dalam mengidentifikasi masalah ini:
IDENT_CURRENT()
– mengembalikan nilai identitas terakhir yang dihasilkan untuk tabel atau tampilan tertentu pada kolom identitas.@@IDENTITY
– Mengembalikan nilai identitas yang terakhir dimasukkan dalam sesi saat ini.IDENT_SEED()
– Mengembalikan benih asli dari kolom identitas.IDENT_INCR()
– Mengembalikan nilai kenaikan kolom identitas.
Juga, berikut adalah 3 Cara untuk Mendapatkan Tipe Data Kolom jika Anda tidak yakin apa tipe data kolom itu.
Kesalahan yang Sama dalam Skenario Berbeda
Galat yang sama (Msg 8115) juga dapat terjadi (dengan pesan galat yang sedikit berbeda) ketika Anda mencoba untuk secara eksplisit mengonversi antara tipe data dan nilai asli berada di luar kisaran tipe baru. Lihat Memperbaiki "Kesalahan overflow aritmatika mengonversi int ke tipe data numerik" di SQL Server untuk memperbaikinya.
Ini juga dapat terjadi saat Anda menggunakan fungsi seperti SUM()
pada kolom, dan penghitungan menghasilkan nilai yang berada di luar rentang tipe kolom. Lihat Perbaiki “Aritmatika overflow error converting expression to data type int” di SQL Server untuk memperbaikinya.