Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Perbaiki "Kesalahan overflow aritmatika mengonversi IDENTITAS ke tipe data ..." di SQL Server

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kinerja SQL Server TOP IO Query -1

  2. Cara Mengembalikan Hanya Nilai Numerik di SQL Server

  3. Visual Studio:ContextSwitchDeadlock

  4. Aplikasi C# multi-threading dengan panggilan database SQL Server

  5. Cara Menginstal SQL Server di Mac dengan VirtualBox