2010-02-19 42 views
8

Có tối đa không? SQL Server có bắt đầu ném SqlExceptions khi đạt tới mức tối đa không? Làm thế nào để bạn giải quyết nó? (lưu trữ?)Tối đa cho khóa chính int tự động trong SqlServer

Từ tài nguyên Máy chủ SQL, tôi có thể thấy rằng mức tối đa là 2.147.483.647. Tôi xa đó, nhưng tôi chỉ tò mò thôi.

Trả lời

6

bạn sẽ nhìn thấy lỗi sử dụng ví dụ nhỏ này

use tempdb; 

if OBJECT_ID('dbo.test', 'U') is not null drop table dbo.test 

create table test 
(id int identity not null, 
    dummy int not null) 
go 

SET IDENTITY_INSERT dbo.test ON 

insert into test(id, dummy) values(2147483647, 1) 

SET IDENTITY_INSERT dbo.test OFF 

insert into test(dummy) values(1) 

lỗi:

(1 row(s) affected) 
Msg 8115, Level 16, State 1, Line 8 
Arithmetic overflow error converting IDENTITY to data type int. 
Arithmetic overflow occurred. 
9

Số tiền tối đa cho một số thực là 2.147.483.647.

Nếu bạn cố gắng đi qua kích thước tối đa, bạn sẽ nhận được lỗi này:

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

Nếu đó không phải là đủ lớn, sử dụng một bigint (9.223.372.036.854.775.807)

5

tối đa được xác định bởi datatype, không phải bởi các sửa đổi IDENTITY. Đối với cột INT, bạn đã tìm ra mức tối đa. Nếu bạn cần loại dữ liệu có phạm vi rộng hơn, BIGINT là lựa chọn hiển nhiên và có thể được đánh dấu là IDENTITY.

  • TINYINT: từ 0 đến 255
  • SMALLINT: -32.768 qua 32767
  • INT: -2147483648 2147483647 qua
  • BIGINT: -9223372036854775808 qua 9223372036854775807

Tôi mong chờ một lỗi được nâng lên khi cố gắng chèn hàng sau khi đạt mức tối đa, khi triển khai IDENTITY sẽ vẫn cố gắng tăng thêm với mỗi lần chèn.

Mặc dù có thể lưu trữ hàng vào một số kho lưu trữ dữ liệu khác và bắt đầu sử dụng lại số nhận dạng (DBCC CHECKIDENT (jobs, RESEED, 0) sẽ đặt lại bộ đếm), nó không phải là thứ mà SQL Server cung cấp ngoài hộp. Bạn sẽ phải thực hiện logic cho chính mình, và hơn nữa bạn sẽ phải xem xét những loại rắc rối sử dụng lại định danh có thể mang đến cho ứng dụng của bạn. Ví dụ: đối với một ứng dụng web, các URL cũ có thể trỏ đến các tài liệu mới hoặc trả về lỗi 404 không?

1

Lưu ý rằng nếu bạn cắt bàn, bạn là chủ yếu đặt lại ID. Có thể hữu ích trong trường hợp bạn không thể thả và tạo lại bảng.

+0

Câu trả lời này sẽ được cải thiện bằng liên kết đến nguồn tài liệu. –

1

Nếu bạn nhấn mạnh vào sử dụng cho các kiểu dữ liệu ví dụ INT cho khóa chính của bạn và bạn đã đạt đến hết khả năng của kiểu dữ liệu này, bạn phải làm như sau:

  1. Xóa dữ liệu cũ. Ví dụ: xóa khỏi TABLENAME nơi pk Tất nhiên, nếu dữ liệu của bạn quan trọng, trước khi xóa, bạn phải di chuyển chúng vào bảng lưu trữ. Bằng cách đó, phạm vi từ 1 đến 1000000 sẽ trở thành miễn phí và bạn có thể sử dụng nó. Giả sử rằng khóa chính của bạn được chèn động. Bằng cách đó bạn phải RESEED khóa chính của bạn.
  2. Chạy truy vấn này trên bàn của bạn:

    DBCC CHECKIDENT (TableName, gieo hạt, 0)

Bằng cách đó, hồ sơ của bạn sẽ được chèn bằng khóa chính từ 1.

Nhưng xem xét rằng nếu pk của bạn đạt đến 1000001, bạn sẽ gặp phải một lỗi vì khóa chính này tồn tại trong bảng của bạn. Nói cách khác, bạn luôn phải xem xét khóa chính của mình.

Các vấn đề liên quan