Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Khắc phục “Lỗi tràn số học khi chuyển đổi IDENTITY thành kiểu dữ liệu…” trong SQL Server

Nếu bạn gặp lỗi “ Msg 8115, Lỗi tràn số học cấp 16 khi chuyển đổi IDENTITY thành loại dữ liệu… ”Trong SQL Server, có thể là do bạn đang cố gắng chèn dữ liệu vào bảng khi IDENTITY của nó cột đã đạt đến giới hạn của loại dữ liệu.

IDENTITY cột tự động tăng giá trị được chèn với mỗi hàng mới. Nếu giá trị đang được chèn nằm ngoài phạm vi của loại dữ liệu của cột thì lỗi trên sẽ xảy ra.

Ví dụ về lỗi

Dưới đây là một ví dụ về mã dẫn đến lỗi:

INSERT INTO t1 VALUES ('Dog');

Kết quả:

Msg 8115, Level 16, State 1, Line 1
Arithmetic overflow error converting IDENTITY to data type tinyint.

Trong trường hợp này, IDENTITY của tôi cột sử dụng tinyint kiểu dữ liệu, có phạm vi từ 0 đến 255. Lỗi ngụ ý rằng IDENTITY đang cố gắng chèn một giá trị cao hơn 255.

Điều này thường xảy ra khi chúng tôi đã chèn 255 hàng vào cột và bây giờ chúng tôi đang cố gắng chèn hàng thứ 256.

Đây là bảng của tôi trông như thế nào khi tôi chọn tất cả các hàng có IDENTITY cột lớn hơn 250 :

SELECT * FROM t1
WHERE c1 > 250;

Kết quả:

+------+------+
| c1   | c2   |
|------+------|
| 251  | Ant  |
| 252  | Cow  |
| 253  | Bat  |
| 254  | Duck |
| 255  | Bull |
+------+------+

Trong trường hợp này, c1IDENTITY của tôi cột (thường là loại tinyint ). Chúng ta có thể thấy rằng IDENTITY trước đó đã tạo 255 cho cột và vì vậy giá trị tiếp theo cố gắng chèn là 256 (giả sử giá trị gia tăng là 1 và không có lần chèn nào bị lỗi trước đó). Điều này sẽ gây ra lỗi ở trên, vì 256 nằm ngoài phạm vi của tinyint .

Vấn đề tương tự có thể xảy ra với các loại dữ liệu của smallint (giá trị tối đa là 32,767) hoặc int (giá trị lớn nhất là 2,147,483,647). Nó cũng có thể xảy ra với bigint nếu bạn đã chèn đủ hàng (hơn 9.223.372.036.854.775.807).

Tuy nhiên, IDENTITY không phải lúc nào giá trị cũng khớp với số hàng được chèn. Bạn có thể đặt giá trị gốc khi tạo IDENTITY và bạn cũng có thể đặt giá trị gia tăng. Do đó, bạn có thể dễ dàng đạt đến giới hạn trên sớm hơn nhiều so với số lần chèn được thực hiện trên bảng, tùy thuộc vào giá trị gốc và giá trị gia tăng.

Ngoài ra, việc xóa các hàng khỏi bảng không đặt lại IDENTITY giá trị (mặc dù không cắt bớt một bảng).

Do đó, bạn vẫn có thể gặp lỗi trên ngay cả khi có ít hàng hơn nhiều trong bảng so với IDENTITY loại dữ liệu của cột có thể đề xuất.

Giải pháp

Một giải pháp là thay đổi kiểu dữ liệu của IDENTITY cột. Ví dụ:nếu đó là smallint , thay đổi nó thành int . Hoặc nếu nó đã là int , thay đổi nó thành bigint .

Một giải pháp khả thi khác là đặt lại IDENTITY giống với giá trị thấp hơn. Điều này sẽ chỉ hoạt động nếu bạn đã xóa nhiều hàng khỏi bảng hoặc nếu giá trị gốc ban đầu cao hơn nhiều so với 1 .

Ví dụ:nếu IDENTITY cột đã là một int , nhưng IDENTITY hạt giống bắt đầu từ nói 2,000,000,000 , bạn có thể đặt lại IDENTITY hạt giống đến 1 , điều này sẽ cho phép thêm 2 tỷ hàng khác được chèn vào.

Các chức năng hữu ích

Dưới đây là một số chức năng có thể rất hữu ích trong việc xác định vấn đề này:

  • IDENT_CURRENT() - trả về giá trị nhận dạng cuối cùng được tạo cho một bảng hoặc chế độ xem được chỉ định trên cột nhận dạng.
  • @@IDENTITY - Trả về giá trị nhận dạng được chèn cuối cùng trong phiên hiện tại.
  • IDENT_SEED() - Trả về gốc ban đầu của cột danh tính.
  • IDENT_INCR() - Trả về giá trị gia tăng của một cột nhận dạng.

Ngoài ra, đây là 3 cách để lấy loại dữ liệu của cột trong trường hợp bạn không chắc chắn loại dữ liệu của cột là gì.

Cùng một lỗi trong các tình huống khác nhau

Lỗi tương tự (Msg 8115) cũng có thể xảy ra (với thông báo lỗi hơi khác) khi bạn cố gắng chuyển đổi rõ ràng giữa các kiểu dữ liệu và giá trị ban đầu nằm ngoài phạm vi của kiểu mới. Xem phần Khắc phục “Lỗi tràn số học khi chuyển đổi int thành kiểu dữ liệu số” trong SQL Server để khắc phục lỗi này.

Nó cũng có thể xảy ra khi bạn sử dụng một hàm như SUM() trên một cột và kết quả tính toán dẫn đến một giá trị nằm ngoài phạm vi của loại cột. Xem Khắc phục “Lỗi tràn số học khi chuyển đổi biểu thức thành kiểu dữ liệu int” trong SQL Server để khắc phục sự cố này.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hàm tổng hợp MIN và MAX trong SQL Server

  2. Tham gia một bảng dựa trên các giá trị được phân tách bằng dấu phẩy

  3. SqlBulkCopy từ một danh sách <>

  4. Cách tăng kích thước tệp của tệp dữ liệu trong SQL Server (T-SQL)

  5. Cách nối các chuỗi trong SQL Server với CONCAT ()