Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Sử dụng NEWSEQUENTIALID () để tạo HƯỚNG DẪN Tăng dần trong SQL Server

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 đó.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server Management Studio (SSMS) là gì?

  2. Tránh trùng lặp trong truy vấn CHÈN VÀO CHỌN trong SQL Server

  3. Cách tính tuổi (theo năm) dựa trên Ngày sinh và getDate ()

  4. Câu lệnh CASE trong mệnh đề WHERE trong SQL Server 2008

  5. Làm cách nào để liệt kê tất cả các bảng trong tất cả các cơ sở dữ liệu trong SQL Server trong một tập hợp kết quả?