Khi bạn sử dụng T-SQL để tạo (hoặc thay đổi) bảng trong SQL Server, bạn có tùy chọn sử dụng IDENTITY()
thuộc tính để tạo một cột nhận dạng.
Cột nhận dạng chứa số nhận dạng tự động tăng dần. IDENTITY()
có thể được sử dụng với CREATE TABLE
và ALTER TABLE
tuyên bố.
Cú pháp
Cú pháp như sau:
IDENTITY [ (seed , increment) ]
hạt giống là giá trị được sử dụng cho hàng đầu tiên được tải vào bảng.
Phần tăng là giá trị gia tăng được thêm vào giá trị nhận dạng của hàng trước đó đã được tải.
Bạn phải chỉ định cả hai đối số hoặc không. Nếu bạn không chỉ định, giá trị mặc định là (1,1)
.
Ví dụ 1 - Cách sử dụng cơ bản
Đây là một ví dụ để chứng minh.
CREATE TABLE Pets ( PetId int IDENTITY(1,1) PRIMARY KEY, PetName varchar(255) );
Mã này tạo một bảng có hai cột. Cột đầu tiên (PetId
) là cột nhận dạng vì tôi sử dụng IDENTITY()
tài sản trong định nghĩa của nó.
Bây giờ tôi đã tạo cột nhận dạng, tôi có thể chèn tên vật nuôi vào PetName
mà không cần bao gồm ID cho mỗi hàng.
INSERT INTO Pets (PetName) VALUES ('Homer'), ('Felix'), ('Ruff'); SELECT * FROM Pet;
Kết quả:
+---------+-----------+ | PetId | PetName | |---------+-----------| | 1 | Homer | | 2 | Felix | | 3 | Ruff | +---------+-----------+
Ví dụ 2 - Hạt giống và Sự gia tăng khác nhau
Dưới đây là một ví dụ sử dụng hạt giống và giá trị gia tăng khác.
Trong trường hợp này, hạt giống bắt đầu từ 150 và tăng thêm 10 cho mỗi hàng.
CREATE TABLE Cities ( CityId int IDENTITY(150, 10) PRIMARY KEY, CityName varchar(255) );
Bây giờ, hãy chèn một số dữ liệu và chọn nó:
INSERT INTO Cities (CityName) VALUES ('Auckland'), ('Danang'), ('Khon Kaen'); SELECT * FROM Cities;
Kết quả:
+----------+------------+ | CityId | CityName | |----------+------------| | 150 | Auckland | | 160 | Danang | | 170 | Khon Kaen | +----------+------------+
Ví dụ 3 - Sử dụng Không chính xác
Như đã đề cập, bạn phải chỉ định cả hai đối số hoặc không. Nói cách khác, bạn không thể cung cấp chỉ một đối số. Dưới đây là một ví dụ về những gì sẽ xảy ra khi bạn chỉ cung cấp một đối số.
CREATE TABLE Cities ( CityId int IDENTITY(1) PRIMARY KEY, CityName varchar(255) );
Kết quả:
Msg 102, Level 15, State 1, Line 2 Incorrect syntax near ')'.
Ví dụ 4 - Cố gắng Ghi đè Giá trị Nhận dạng
Nếu bạn cố gắng ghi đè các giá trị nhận dạng tự động, bạn có thể gặp phải lỗi như thế này.
INSERT INTO Cities (CityId, CityName) VALUES (123, 'Bangkok');
Kết quả:
Msg 544, Level 16, State 1, Line 1 Cannot insert explicit value for identity column in table 'Cities' when IDENTITY_INSERT is set to OFF.
Điều này là do bạn đang cố gắng ghi đè các giá trị được tạo bởi IDENTITY()
bất động sản. Trong nhiều trường hợp, có thể bạn không biết đó là cột nhận dạng. Trong những trường hợp như vậy, tất cả những gì bạn cần làm là xóa cột nhận dạng khỏi INSERT
của bạn tuyên bố.
Tuy nhiên, nếu bạn thực sự làm cần ghi đè IDENTITY()
, hãy xem Cách Chèn Giá trị vào Cột IDENTITY trong SQL Server.
Như đã đề cập, nếu bạn không cần ghi đè các giá trị nhận dạng, bạn có thể chỉ cần xóa cột đó khỏi INSERT
của mình tuyên bố.
Vì vậy, tôi có thể sửa đổi câu lệnh trước thành điều này:
INSERT INTO Cities (CityName) VALUES ('Bangkok'); SELECT * FROM Cities;
Kết quả:
+----------+------------+ | CityId | CityName | |----------+------------| | 150 | Auckland | | 160 | Danang | | 170 | Khon Kaen | | 180 | Bangkok | +----------+------------+
Hạn chế của thuộc tính IDENTITY ()
Thuộc tính nhận dạng trên một cột đảm bảo những điều sau:
- Mỗi giá trị mới được tạo dựa trên nguồn gốc và phần tăng thêm hiện tại.
- Mỗi giá trị mới cho một giao dịch cụ thể khác với các giao dịch đồng thời khác trên bảng.
Nó không đảm bảo những điều sau:
- Tính duy nhất của giá trị
- Các giá trị liên tiếp trong một giao dịch
- Các giá trị liên tiếp sau khi máy chủ khởi động lại hoặc các lỗi khác
- Sử dụng lại các giá trị (ví dụ:khi
INSERT
hoạt động không thành công)
Để biết thêm thông tin về những hạn chế này, hãy xem tài liệu của Microsoft.