Tôi đã xóa một số bản ghi từ một bảng trong cơ sở dữ liệu SQL Server. Bây giờ ID đi từ 101 đến 1200. Tôi muốn xóa các bản ghi một lần nữa, nhưng tôi muốn ID trở lại 102. Có cách nào để làm điều này trong SQL Server không?
Tôi đã xóa một số bản ghi từ một bảng trong cơ sở dữ liệu SQL Server. Bây giờ ID đi từ 101 đến 1200. Tôi muốn xóa các bản ghi một lần nữa, nhưng tôi muốn ID trở lại 102. Có cách nào để làm điều này trong SQL Server không?
Câu trả lời:
Ban hành lệnh sau để khởi động lại mytable để bắt đầu lúc 1:
DBCC CHECKIDENT (mytable, RESEED, 0)
Đọc về nó trong Sách trực tuyến (BOL, trợ giúp SQL). Ngoài ra, hãy cẩn thận rằng bạn không có hồ sơ cao hơn hạt giống bạn đang thiết lập.
DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT('databasename.dbo.tablename', RESEED, number)
if number = 0 thì trong lần chèn tiếp theo, trường tăng tự động sẽ chứa giá trị 1
nếu số = 101 thì trong lần chèn tiếp theo, trường tăng tự động sẽ chứa giá trị 102
Một số thông tin bổ sung ... Có thể hữu ích cho bạn
Trước khi đưa ra mức tăng tự động number
trong truy vấn trên, bạn phải đảm bảo cột tăng tự động của bảng hiện có chứa các giá trị ít hơn number
.
Để lấy giá trị tối đa của một cột (cột_name) từ một bảng (bảng1), bạn có thể sử dụng truy vấn sau
SELECT MAX(column_name) FROM table1
bán ngớ ngẩn:
declare @max int;
select @max = max(key) from table;
dbcc checkident(table,reseed,@max)
http://sqlserverplanet.com/tsql/USE-dbcc-checkident-to-reseed-a-table-after-delete
Nếu bạn đang sử dụng MySQL, hãy thử điều này:
ALTER TABLE tablename AUTO_INCREMENT = 1
Xóa và lấy lại tất cả các bảng trong cơ sở dữ liệu.
USE [DatabaseName]
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all" -- Disable All the constraints
EXEC sp_MSForEachTable "DELETE FROM ?" -- Delete All the Table data
Exec sp_MSforeachtable 'DBCC CHECKIDENT(''?'', RESEED, 0)' -- Reseed All the table to 0
Exec sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all" -- Enable All the constraints back
-- You may ignore the errors that shows the table without Auto increment field.
Dựa trên câu trả lời được chấp nhận, đối với những người gặp phải vấn đề tương tự, với trình độ lược đồ đầy đủ:
( [MyDataBase].[MySchemaName].[MyTable]
) ... dẫn đến một lỗi, bạn cần phải ở trong bối cảnh của DB đó
Đó là, sau đây sẽ đưa ra một lỗi:
DBCC CHECKIDENT ([MyDataBase].[MySchemaName].[MyTable], RESEED, 0)
Thay vào đó, hãy đặt tên bảng đủ điều kiện bằng dấu ngoặc đơn:
DBCC CHECKIDENT ('[MyDataBase].[MySchemaName].[MyTable]', RESEED, 0)
Một số câu trả lời khuyên bạn nên sử dụng một câu như thế này:
DBCC CHECKIDENT (mytable, RESEED, 0)
Nhưng OP cho biết "đã xóa một số hồ sơ", có thể không phải là tất cả trong số họ, vì vậy giá trị 0 không phải lúc nào cũng đúng. Một câu trả lời khác đề nghị tự động tìm giá trị hiện tại tối đa và khởi động lại giá trị đó, nhưng nó sẽ gặp rắc rối nếu không có bản ghi trong bảng và do đó max () sẽ trả về NULL. Một bình luận được đề xuất sử dụng đơn giản
DBCC CHECKIDENT (mytable)
để đặt lại giá trị, nhưng một nhận xét khác đã nêu chính xác rằng điều này chỉ làm tăng giá trị lên mức tối đa đã có trong bảng; điều này sẽ không làm giảm giá trị nếu nó đã cao hơn mức tối đa trong bảng, đó là điều mà OP muốn làm.
Một giải pháp tốt hơn kết hợp những ý tưởng này. CHECKIDENT đầu tiên đặt lại giá trị thành 0 và lần thứ hai đặt lại giá trị cao nhất hiện tại trong bảng, trong trường hợp có các bản ghi trong bảng:
DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT (mytable)
Như nhiều bình luận đã chỉ ra, hãy đảm bảo không có khóa ngoại trong các bảng khác trỏ đến các bản ghi bị xóa. Nếu không, các khóa ngoại đó sẽ trỏ đến các bản ghi bạn tạo sau khi sắp xếp lại bảng, điều này gần như chắc chắn không phải là những gì bạn có trong tâm trí.
Tôi muốn thêm câu trả lời này vì DBCC CHECKIDENT
-approach sẽ tạo ra vấn đề khi bạn sử dụng lược đồ cho các bảng. Sử dụng điều này để chắc chắn:
DECLARE @Table AS NVARCHAR(500) = 'myschema.mytable';
DBCC CHECKIDENT (@Table, RESEED, 0);
Nếu bạn muốn kiểm tra sự thành công của hoạt động, hãy sử dụng
SELECT IDENT_CURRENT(@Table);
mà nên xuất ra 0
trong ví dụ trên.
Bạn không muốn làm điều này nói chung. Reseed có thể tạo ra vấn đề toàn vẹn dữ liệu. Nó thực sự chỉ được sử dụng trên các hệ thống phát triển nơi bạn đang xóa sạch tất cả dữ liệu thử nghiệm và bắt đầu lại. Không nên sử dụng nó trên một hệ thống sản xuất trong trường hợp tất cả các bản ghi liên quan chưa bị xóa (không phải tất cả các bảng trong mối quan hệ khóa ngoài là!). Bạn có thể tạo ra một mớ hỗn độn làm điều này và đặc biệt nếu bạn muốn làm điều đó một cách thường xuyên sau mỗi lần xóa. Đó là một ý tưởng tồi để lo lắng về những khoảng trống trong các giá trị trường nhận dạng của bạn.
Cái này thì sao?
ALTER TABLE `table_name`
MODIFY `id` int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;
Đây là một cách nhanh chóng và đơn giản để thay đổi mức tăng tự động thành 0 hoặc bất kỳ số nào bạn muốn. Tôi đã tìm ra điều này bằng cách xuất một cơ sở dữ liệu và tự đọc mã.
Bạn cũng có thể viết nó như thế này để biến nó thành một giải pháp một dòng:
ALTER TABLE `table_name` MODIFY `id` int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;