Tác giả |
|
DUCVINH83 Administrator
Không ngừng học hỏi !
Ngày gia nhập: 01/11/2005 Giới tính: Đến từ: Vietnam
Trạng thái: Bài viết: 365 Tiền: 738$ Địa chỉ e-mail: Yahoo! IM: Sinh nhật: 17/02/1983 Cảnh cáo: (0%)
|
Ngày gửi: 22/01/2010 lúc 11:01 sáng | Đã khóa IP
|
|
|
dkthien 05-28-2009, 12:28 PM Đính chính bài trên một chút, e xem lại nhé:
Ở đây mình sẽ có một số lệnh về vấn đề ResetID
1. DBCC CHECKIDENT(TableName,NORESEED)
+ Lệnh này chỉ đơn thuần trả về giá trị identity (*) hiện tại và giá trị ID lớn nhất (**) trong bảng.
+ VD dãy ID: 4,5,6 => khi reset ID bắt đầu lại từ 0 và thực hiện
INSERT thêm 2 bản ghi khi đó được dãy mới ID: 1,2,4,5,6 => (*) sẽ
là: 2 và (**) sẽ là: 6
+ Vậy lệnh này chỉ dùng để xem thông tin
2. DBCC CHECKIDENT(TableName,RESEED) hoặc DBCC CHECKIDENT(TableName)
+ Lệnh này làm cho ID luôn bắt đầu bằng giá trị ID lớn nhất có trong bảng
+ VD: Có dãy ID: 4,5,6
- Bước 1: Reset ID bắt đầu lại từ 0
- Bước 2: Thực hiện INSERT thêm 2 bản ghi khi đó được dãy mới ID: 1,2,4,5,6
- Bước 3: Chạy lệnh trên (lệnh 2)
- Bước 4: INSERT thêm 1 bản ghi nữa ta được dãy mới là ID: 1,2,4,5,6,7
##### Vậy nếu thực hiện Bước 3 thì ID sẽ bắt đầu từ giá trị lớn nhất
trong dãy ID ở Bước 2 là: 6, nếu không thực hiện Bước 3 thì sau khi
bước 4 thực hiện xong được dãy ID: 1,2,3,4,5,6
3. DBCC CHECKIDENT(TableName,RESEED, NewResetValues)
+ Lệnh này cho phép ta đặt lại giá trị bắt đầu của ID (NewResetValues)
+ VD: có dãy ID: 4,5,6
- Bước 1: Chạy lệnh trên (lệnh 3) như sau: DBCC CHECKIDENT(TableName,RESEED, 0) => ID cũ là 0
- Bước 2: INSERT thêm 3 bản ghi ta được dãy ID: 1,2,3,4,5,6
- Vậy ID mới = ID cũ + current increment value
- Tuy nhiên khi INSERT thêm 1 bản ghi nữa thì xuất hiện lỗi trùng khóa
ở trong SQL => Vì sao? ( Yes! ). Còn bỏ qua lỗi đó cứ tiếp tục
INSERT 3 lần nữa thì được dãy ID: 1,2,3,4,5,6,7
*****
Vậy nếu e muốn giải quyết bài toán của mình thì cần phải thiết kế một
thuật toán riêng để kiểm tra khoảng trống trong dãy ID (Khoảng trống là
các ID bị xóa) rồi kết hợp với 3 lệnh trên để xác định vị trí bắt đầu
rồi, điền dữ liệu, đến đâu thì nhảy tới khoảng trống khác(nếu còn) và
làm tiếp như vậy.
Tham khảo thêm ở Microsoft Link này:
http://msdn.microsoft.com/en-us/library/aa258817(SQL.80).a spx
__________________
YM: DUCVINH83
0912 822334
|
Lên trên |
|
|
DUCVINH83 Administrator
Không ngừng học hỏi !
Ngày gia nhập: 01/11/2005 Giới tính: Đến từ: Vietnam
Trạng thái: Bài viết: 365 Tiền: 738$ Địa chỉ e-mail: Yahoo! IM: Sinh nhật: 17/02/1983 Cảnh cáo: (0%)
|
Ngày gửi: 22/01/2010 lúc 11:02 sáng | Đã khóa IP
|
|
|
HcCuongMeocH 06-20-2009, 03:58 PM không biết có giúp được gì bạn không
Đây là 1 hàm khá hay trong cơ sở dữ liệu . Hàm này sẽ tự động tìm ra số
còn thiếu trong bảng và cung cấp số đó cho dòng dữ liệu mới nhất được
thêm vào.Ví dụ 1,2,...5 thì số còn thiếu là 3 và 4 .Số ta có ở lần chạy
đầu sẽ là 3, lần sau sẽ là 4.
Hàm này sử dụng khi số thứ tự đó không có nhiều ý nghĩa mà chỉ dùng quản lý.Ví dụ như bảng user(UserID,UserName,Password),
trường UserID chỉ dùng để quản lý không mang nhiều ý nghĩa.
create function SoThuTu()
returns int
as
begin
declare @stt int
with bangtam as
(
select UserID from user where UserID + 1 not in
(select UserID from user)
union all
select 1 from user where not exists
(select 1 from user where UserID = 1)
)
select @stt = min(UserID) from bangtam
return @stt + 1
end
select dbo.SoThuTu()
__________________
YM: DUCVINH83
0912 822334
|
Lên trên |
|
|
DUCVINH83 Administrator
Không ngừng học hỏi !
Ngày gia nhập: 01/11/2005 Giới tính: Đến từ: Vietnam
Trạng thái: Bài viết: 365 Tiền: 738$ Địa chỉ e-mail: Yahoo! IM: Sinh nhật: 17/02/1983 Cảnh cáo: (0%)
|
Ngày gửi: 22/01/2010 lúc 12:30 chiều | Đã khóa IP
|
|
|
Ừm cái lệnh này hay quá, tìm mãi mới thấy, sử dụng rất hiệu quả. Dùng được cho cả SQL Server 2005 đó bà con ...
__________________
YM: DUCVINH83
0912 822334
|
Lên trên |
|
|
|
|