2009-04-07 32 views
31

Tôi có một tình huống lạ với một số bảng trong cơ sở dữ liệu của tôi bắt đầu ID của nó từ 0, mặc dù TABLE CREATE có IDENTITY (1,1). Điều này là như vậy đối với một số bảng, nhưng không phải cho những người khác. Nó đã hoạt động cho đến ngày hôm nay.Giá trị cột nhận dạng máy chủ SQL bắt đầu bằng 0 thay vì 1

Tôi đã thử đặt lại cột sắc:

DBCC CHECKIDENT (SyncSession, reseed, 0); 

Nhưng kỷ lục mới bắt đầu với 0. Tôi đã cố gắng làm điều này cho tất cả các bảng, nhưng một số vẫn bắt đầu từ 0 và một số từ 1.

Bất kỳ con trỏ nào?

(Tôi đang sử dụng SQL Server Express 2005 với dịch vụ nâng cao)

+0

Có điều gì đó sai với thiết kế của bạn nếu bạn liên tục nhập lại giá trị. Và tại sao nó lại quan trọng nếu nó bắt đầu bằng 0 hoặc 1?Đó là một autoincrement, nó không quan trọng những gì giá trị chỉ là nó là duy nhất và tự động được giao. – HLGEM

+2

Năm năm muộn cho bữa tiệc nhưng - như tôi - OP có thể vừa phát triển và thử nghiệm với một bộ dữ liệu đã biết. Không nhất thiết phải bất cứ điều gì sai với thiết kế. – GeoffM

+0

@ HLGEM - đây là lý do tại sao nó phát triển. nếu bạn đang cư trú một đối tượng mã từ một bản ghi cơ sở dữ liệu, đối tượng sẽ khởi tạo với một thuộc tính "ID" là 0. Sau đó, nếu populating thành công nó sẽ là một cái gì đó khác với mặc định 0. 0 có thể cho biết không tìm thấy bản ghi hoặc một đối tượng "mới". – nuander

Trả lời

41

Từ DBCC CHECKIDENT

DBCC CHECKIDENT (table_name, RESEED, new_reseed_value) 

Nếu không có hàng đã được đưa đến bảng kể từ khi được tạo hoặc tất cả các hàng đã bị xóa bằng cách sử dụng câu lệnh TẠO TRUNCATE,đầu tiên Hàngđược chèn sau khi bạn chạy DBCC CHECKIDENT sử dụng new_reseed_value làm danh tính. Nếu không, hàng tiếp theo được chèn vào sử dụng new_reseed_value + giá trị gia tăng hiện tại.

Vì vậy, điều này được mong đợi cho một bảng trống hoặc cắt ngắn.

+0

Chỉ cần thông tin, câu lệnh DELETE FROM sẽ sử dụng hành vi sau, "hàng tiếp theo được chèn vào sử dụng new_reseed_value + giá trị gia tăng hiện tại". –

+0

DELETE sẽ không đặt lại hạt giống .. đó là ý của bạn? – gbn

+0

@GBN, đó là sự thật, nhưng những gì tôi đã đề cập đến là sử dụng DBCC CHECKIDENT (SyncSession, reseed, new_reseed_value); để đặt lại một hạt giống cho một bảng sau khi DELETE sẽ lấy new_reseed_value và thêm nó vào giá trị gia tăng hiện tại cho hàng đầu tiên. –

2

Đây là logic, vì bạn đã thay đổi (trồng cỏ mới) giá trị bản sắc về không?

DBCC CHECKIDENT (SyncSession, reseed, 1) 

sẽ gieo hạt cột danh tính của bạn, và chắc chắn rằng các kỷ lục mới đầu tiên sẽ bắt đầu với 1.

+1

Không, điều đó không đúng. Giá trị đầu tiên được sử dụng nếu bạn chỉ định 1 theo cách này sẽ là 2! –

+0

Ah, trừ khi bạn làm điều này trên một bảng trống, trong trường hợp đó, nó sẽ lấy giá trị bạn chỉ định. Xin lỗi !!! –

+0

Tôi đã thử điều này trên các bảng trống và bây giờ một số bảng bắt đầu từ 1 và một số bảng từ 2. – Muxa

2

Tôi có cùng sự cố, khôi phục từ bản sao lưu sau khi sửa đổi DB. Tôi chỉ cần thêm một bản ghi giả và sau đó xóa nó ... sau đó thiết lập RESEED thành 0. Có vẻ để làm việc.

1

Hãy thử điều này

DECLARE @c TABLE (TanvtechId varchar(10),NewTanvtechId Varchar(10)) 
INSERT INTO @c 
SELECT TanvtechId , Row_Number() OVER (ORDER BY TanvtechId) from Tanvtech 

UPDATE G 
SET G.TanvtechId =a.NewTanvtechId 
FROM Tanvtech as G INNER JOIN @c as a ON a.TanvtechId =G.TanvtechId 
3

Nếu bạn vượt qua một giá trị gieo hạt DB sẽ bắt đầu tính từ đó giá trị mới:

DBCC CHECKIDENT (SyncSession, RESEED, 0); --next record should be 0 + increment 

Bạn không cần phải vượt qua một giá trị mặc dù, nếu bạn không sử dụng IDENTITY(a,b) để thay thế:

DBCC CHECKIDENT (SyncSession, RESEED); --next record should be the seed value 'a' 

Đây là phương pháp hay hơn vì nó rời khỏi ble gần với trạng thái ban đầu được tạo ra của nó.

-1
DBCC CHECKIDENT (Table_Name, RESEED, 0) 

Đây là một cách để bắt đầu một id với Zero(0), sau đó xóa tất cả các hàng từ bảng và một lần nữa đưa dữ liệu trở lại vào bảng.

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