Trong SQL Server, bạn có thể sử dụng NEWSEQUENTIALID()
chức năng tạo các giá trị duy nhất gia tăng.
Nó tạo ra một GUID (Bộ nhận dạng duy nhất trên toàn cầu) lớn hơn bất kỳ GUID nào được tạo bởi chức năng này trước đây trên một máy tính được chỉ định kể từ khi hệ điều hành được khởi động. Sau khi khởi động lại hệ điều hành, GUID có thể bắt đầu lại từ phạm vi thấp hơn, nhưng vẫn là duy nhất trên toàn cầu.
NEWSEQUENTIALID()
chỉ có thể được sử dụng chức năng với DEFAULT
ràng buộc đối với các cột của bảng thuộc loại uniqueidentifier . Do đó, bạn không thể chỉ chạy một truy vấn như SELECT NEWSEQUENTIALID()
và mong đợi nó hoạt động (nhưng bạn có thể làm điều đó với NEWID()
chức năng).
Ví dụ 1 - Dưới dạng giá trị DEFAULT
Dưới đây là một ví dụ nhanh để chứng minh cách nó hoạt động:
USE Test; CREATE TABLE Prisoner ( PrisonerId uniqueidentifier NOT NULL DEFAULT NEWSEQUENTIALID(), PrisonerName varchar(70) NOT NULL, ); INSERT Prisoner (PrisonerName) VALUES ('Jerry Seinfeld'), ('George Costanza'), ('Elaine Benes'); SELECT * FROM Prisoner;
Kết quả:
+--------------------------------------+-----------------+ | PrisonerId | PrisonerName | |--------------------------------------+-----------------| | a46d433e-f36b-1410-8a80-007d2b533547 | Jerry Seinfeld | | aa6d433e-f36b-1410-8a80-007d2b533547 | George Costanza | | b06d433e-f36b-1410-8a80-007d2b533547 | Elaine Benes | +--------------------------------------+-----------------+
Lưu ý rằng các GUID được tạo như một phần của DEFAULT
ràng buộc trên bàn. Chúng không được cung cấp rõ ràng trong INSERT
tuyên bố.
Ví dụ 2 - Được cung cấp rõ ràng trong Tuyên bố INSERT
Đây là những gì sẽ xảy ra nếu bạn cố gắng sử dụng NEWSEQUENTIALID()
trong INSERT
của bạn tuyên bố:
INSERT Prisoner (PrisonerId, PrisonerName) VALUES (NEWSEQUENTIALID(), 'Kramer');
Kết quả:
Msg 302, Level 16, State 0, Line 1 The newsequentialid() built-in function can only be used in a DEFAULT expression for a column of type 'uniqueidentifier' in a CREATE TABLE or ALTER TABLE statement. It cannot be combined with other operators to form a complex scalar expression.
Vì vậy, nó cần phải là một phần của DEFAULT
ràng buộc (như trong ví dụ trước).
Để chèn dữ liệu trên, tất cả những gì chúng ta cần làm là xóa cột đầu tiên khỏi INSERT
hoạt động:
INSERT Prisoner (PrisonerName) VALUES ('Kramer'); SELECT * FROM Prisoner;
Kết quả:
+--------------------------------------+-----------------+ | PrisonerId | PrisonerName | |--------------------------------------+-----------------| | a46d433e-f36b-1410-8a80-007d2b533547 | Jerry Seinfeld | | aa6d433e-f36b-1410-8a80-007d2b533547 | George Costanza | | b06d433e-f36b-1410-8a80-007d2b533547 | Elaine Benes | | b76d433e-f36b-1410-8a80-007d2b533547 | Kramer | +--------------------------------------+-----------------+
Ví dụ 3 - Được sử dụng trong Câu lệnh SELECT
Bạn sẽ gặp lỗi tương tự nếu cố sử dụng chức năng này trong SELECT
cơ bản tuyên bố như thế này:
SELECT NEWSEQUENTIALID();
Kết quả:
Msg 302, Level 16, State 0, Line 1 The newsequentialid() built-in function can only be used in a DEFAULT expression for a column of type 'uniqueidentifier' in a CREATE TABLE or ALTER TABLE statement. It cannot be combined with other operators to form a complex scalar expression.
Bảo mật / Quyền riêng tư
Bạn không nên sử dụng NEWSEQUENTIALID()
đối với dữ liệu nhạy cảm, vì có thể đoán giá trị của GUID được tạo tiếp theo và do đó, truy cập vào dữ liệu được liên kết với GUID đó.