Trong bài viết này, chúng ta sẽ khám phá những điều cơ bản và chi tiết về thuộc tính SQL Server IDENTITY và các tính năng của cột IDENTITY. Ngoài ra, chúng tôi sẽ xem xét cách chèn các giá trị rõ ràng vào các cột nhận dạng thông qua tính năng IDENTITY_INSERT.
Giới thiệu về thuộc tính IDENTITY của SQL Server và cột IDENTITY
Trong SQL Server, thuộc tính nhận dạng cho phép chúng ta tạo các cột nhận dạng trong bảng SQL Server theo cài đặt của cú pháp thuộc tính nhận dạng. Cú pháp của thuộc tính nhận dạng trông như sau và chúng tôi áp dụng cú pháp này để tạo hoặc thay đổi một câu lệnh bảng.
IDENTITY [(hạt giống, số gia tăng)]
Đầu tiên, chúng ta sẽ kiểm tra các tham số của thuộc tính nhận dạng. Thuộc tính này nhận hai tham số đầu vào:tham số đầu tiên là hạt giống và tham số thứ hai là gia số. Tham số gốc chỉ định rằng giá trị bắt đầu đầu tiên của giá trị được chèn vào bảng và tham số Tăng xác định giá trị gia tăng của dữ liệu được chèn.
Bây giờ, chúng tôi sẽ củng cố định nghĩa chính về đặc tính nhận dạng này với một số ví dụ.
Cách tạo cột Danh tính trong SQL Server
Ví dụ-1 :Trong ví dụ sau, chúng tôi sẽ tạo một cột nhận dạng và giá trị đầu tiên sẽ bắt đầu từ 1 và tăng 1 x 1.
DROP TABLE IF TỒN TẠI BẢNG TestIdentityCREATE TestIdentity (Id INT IDENTITY (1,1), Col1 VARCHAR (100)) MỤC TIÊU VÀO TestIdentityVALUES ('Hàng được chèn đầu tiên') CHÈN VÀO TestIdentityVALUES ('Hàng được chèn thứ hai') CHÈN VÀO TestIdentityVALUES ('Hàng được chèn thứ ba') CHÈN VÀO TestIdentityVALUES ('Hàng được chèn thứ tư') CHỌN Id as [IdentityColumn], Col1 FROM TestIdentity
Ví dụ-2 :Trong ví dụ sau, chúng tôi sẽ tạo một cột nhận dạng và giá trị đầu tiên sẽ bắt đầu từ 37 và tăng 20 lên 20.
DROP TABLE NẾU TỒN TẠI BẢNG TestIdentityCREATE TestIdentity (Id INT IDENTITY (37,20), Col1 VARCHAR (100)) GOINSERT INTO TestIdentityVALUES ('Dòng được chèn đầu tiên') INSERT INTO TestIdentityVALUES ('Dòng thứ hai được chèn vào') INSERT INTO TestIdentityVALUES ('Hàng được chèn thứ ba') CHÈN VÀO TestIdentityVALUES ('Hàng được chèn thứ tư') CHỌN Id as [IdentityColumn], Col1 FROM TestIdentity
Như bạn có thể thấy trong ví dụ trên, thuộc tính nhận dạng cung cấp việc tạo các giá trị tự động tăng theo các thông số gốc và thông số nhận dạng.
Làm cách nào để chèn các giá trị rõ ràng vào cột nhận dạng SQL Server?
Theo mặc định, thuộc tính danh tính không cho phép chúng tôi chèn các giá trị rõ ràng vào các cột danh tính. Nếu bạn cố gắng chèn các giá trị rõ ràng vào cột nhận dạng, bạn sẽ gặp lỗi sau.
DROP TABLE NẾU TỒN TẠI BẢNG TestIdentityCREATE TestIdentity (Id INT IDENTITY (1,1), Col1 VARCHAR (100)) MỤC TIÊU VÀO TestIdentityVALUES (1, 'Hàng được chèn đầu tiên')
Bản tin 8101, Mức 16, Trạng thái 1, Dòng 9
Giá trị rõ ràng cho cột nhận dạng trong table , ‘TestIdentity’ chỉ có thể được chỉ định khi danh sách cột được sử dụng và IDENTITY_INSERT được BẬT.
Chúng tôi có thể khắc phục lỗi này bằng cách bật tính năng IDENTITY_INSERT của bảng. Bây giờ, chúng ta sẽ thay đổi câu lệnh chèn như sau.
DROP TABLE IF tồn tại BẢNG TestIdentityCREATE TestIdentity (Id INT IDENTITY (1,1), Col1 VARCHAR (100)) SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id, Col1) VALUES (1, 'Hàng được chèn đầu tiên') SET IDENTITY_INSERT TestIdentity OFFSELECT * TỪ TestIdentity
Một điểm quan trọng khác về vấn đề này là chúng ta phải viết một danh sách cột để chèn câu lệnh. Nếu chúng tôi không làm điều này, chúng tôi sẽ gặp phải lỗi sau.
DROP TABLE NẾU TỒN TẠI BẢNG TestIdentityCREATE TestIdentity (Id INT IDENTITY (1,1), Col1 VARCHAR (100)) SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity VALUES (1, 'Hàng được chèn đầu tiên') SET IDENTITY_INSERT TestIdentity TẮT <>
Bản tin 8101, Mức 16, Trạng thái 1, Dòng 9
Giá trị rõ ràng cho cột nhận dạng trong table , ‘TestIdentity’ chỉ có thể được chỉ định khi danh sách cột được sử dụng và IDENTITY_INSERT được BẬT.Lỗi này xác định rằng danh sách cột bị thiếu trong câu lệnh chèn. Trong câu lệnh chèn bên dưới, chúng tôi sẽ sửa lỗi này.
DROP TABLE IF tồn tại BẢNG TestIdentityCREATE TestIdentity (Id INT IDENTITY (1,1), Col1 VARCHAR (100)) SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id, Col1) --- cột listVALUES (90, 'Hàng được chèn đầu tiên ') SET IDENTITY_INSERT TestIdentity TẮT
Trong một số trường hợp, chúng ta cần chèn dữ liệu vào một bảng từ một bảng khác. Một trong những cách tốt nhất để thực hiện thao tác này là sử dụng câu lệnh “CHÈN VÀO CHỌN”. Tuy nhiên, nếu bảng đích có cột nhận dạng, chúng ta cần bật tùy chọn IDENTITY_INSERT trong bảng đích. Ngoài ra, chúng ta phải viết danh sách cột của bảng mục tiêu.
BẢNG DROP NẾU TỒN TẠI BẢNG TestIdentityDROP NẾU TỒN TẠI BẢNG TẠO TẠO BẢNG NGUỒN NguồnTable (ID INT, Val1 VARCHAR (100)) CHÈN VÀO CÁC GIÁ TRỊ CỦA Bảng Nguồn (1, 'Hàng đầu tiên'), (2, 'Hàng thứ hai') BẢNG GOCREATE TestIdentity ( Id INT IDENTITY (1,1), Col1 VARCHAR (100)) ĐẶT IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id, Col1) SELECT * FROM SourceTableSET IDENTITY_INSERT TestIdentity OFF
Hạn chế của tùy chọn IDENTITY_INSERT là nó có thể gây ra khoảng cách giữa các giá trị cột nhận dạng. Một câu lệnh tương tự như câu lệnh sau sẽ tạo ra khoảng cách giữa các giá trị cột nhận dạng.
DROP TABLE IF TỒN TẠI BẢNG TestIdentityCREATE TestIdentity (Id INT IDENTITY (1,1), Col1 VARCHAR (100)) CHÈN VÀO TestIdentity --- cột listVALUES ('Hàng được chèn đầu tiên (INDENTITY_INSERT_OFF)') THIẾT LẬP IDENTITY_INSERT TestIdentity TestIdentity (Id, Col1) --- cột listVALUES (90, 'Hàng được chèn thứ hai (INDENTITY_INSERT_ON') SET IDENTITY_INSERT TestIdentity OFFINSERT INTO TestIdentity --- cột listVALUES ('Hàng được chèn thứ ba (INDENTITY_INSERT_OFF)') CHỌN * TỪ TestIdentity
Lệnh DBCC CHECKIDENT
Lệnh DBCC CHECKIDENT cho phép chúng tôi lấy thông tin chi tiết về giá trị cuối cùng của cột nhận dạng. Chức năng này cũng cho phép đặt lại và thay đổi giá trị hiện tại của cột nhận dạng thành giá trị khác. Bây giờ, chúng ta sẽ nhận được giá trị cuối cùng của danh tính thông qua lệnh DBCC CHECKIDENT.
DROP TABLE IF TỒN TẠI BẢNG TestIdentityCREATE TestIdentity (Id INT IDENTITY (1,1), Col1 VARCHAR (100)) MỤC TIÊU VÀO TestIdentityVALUES ('Hàng được chèn đầu tiên') CHÈN VÀO TestIdentityVALUES ('Hàng được chèn thứ hai') CHÈN VÀO TestIdentityVALUES ('Hàng được chèn thứ ba') CHÈN VÀO TestIdentityVALUES ('Hàng được chèn thứ tư') DBCC CHECKIDENT ('TestIdentity', NORESEED)
Một tùy chọn khác về lệnh DBCC CHECKIDENT đang đặt lại cột nhận dạng thành giá trị bắt buộc. Trong ví dụ sau, thông số RESEED thay đổi giá trị tối đa của cột nhận dạng thành 100 và các giá trị được chèn sau đó sử dụng giá trị tối đa này.
DROP TABLE IF TỒN TẠI BẢNG TestIdentityCREATE TestIdentity (Id INT IDENTITY (1,1), Col1 VARCHAR (100)) MỤC TIÊU VÀO TestIdentityVALUES ('Hàng được chèn đầu tiên') CHÈN VÀO TestIdentityVALUES ('Hàng được chèn thứ hai') CHÈN VÀO TestIdentityVALUES ('Hàng được chèn thứ ba') CHÈN VÀO TestIdentityVALUES ('Hàng được chèn thứ tư') GODBCC CHECKIDENT ('TestIdentity', RESEED, 100) GOINSERT INTO TestIdentityVALUES ('Hàng được chèn thứ năm') CHỌN * TỪ TestIdentity
Cột nhận dạng SQL Server và tính duy nhất
Các cột nhận dạng không đảm bảo việc tạo ra các giá trị duy nhất. Đây là vấn đề khó hiểu phổ biến về các cột nhận dạng, vì vậy nếu chúng ta muốn đảm bảo tính duy nhất của các giá trị được tạo, chúng ta có thể sử dụng chỉ mục duy nhất cho các cột này. Bây giờ, chúng tôi sẽ chứng minh và trình bày cách tạo các giá trị trùng lặp trên các cột nhận dạng.
DROP TABLE NẾU TỒN TẠI BẢNG TestIdentityCREATE TestIdentity (Id INT IDENTITY (1,1), Col1 VARCHAR (100)) SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id, Col1) VALUES (1, 'Hàng được chèn đầu tiên (INDENTITY )_INSERT_OFF' ' ) CHÈN VÀO GIÁ TRỊ TestIdentity (Id, Col1) (1, 'Hàng được chèn đầu tiên (INDENTITY_INSERT_OFF)') SET IDENTITY_INSERT TestIdentity OFFSELECT * FROM TestIdentity
Ngoài ra, Cột nhận dạng và Khóa chính là hai đối tượng khác nhau trong SQL Server. Mục đích sử dụng của cột nhận dạng là tạo số tự động tăng dần. Mặt khác, ràng buộc khóa chính đảm bảo và cung cấp tính duy nhất của các giá trị trong một cột cụ thể. Ràng buộc Khóa chính thực thi các giá trị duy nhất cho các cột được xác định bởi vì, theo mặc định, Khóa chính tạo chỉ mục duy nhất được nhóm trong bảng. Trong cách sử dụng phổ biến, ràng buộc Khóa chính và Thuộc tính nhận dạng có thể được sử dụng cùng nhau. Cách tiếp cận sử dụng này giúp chúng tôi mang lại sự linh hoạt của tính năng duy nhất của Khóa chính và tính năng tự động gia tăng Danh tính cho cột được áp dụng. Trong ví dụ sau, chúng tôi cũng sẽ thêm một ràng buộc khóa chính vào cột Id và nó sẽ ngăn trùng lặp các giá trị đã chèn.
DROP TABLE NẾU TỒN TẠI BẢNG TestIdentityCREATE TestIdentity (Id INT IDENTITY (1,1) PRIMARY KEY, Col1 VARCHAR (100)) SET IDENTITY_INSERT TestIdentity ONINSERT INTO TestIdentity (Id, Col1) VALUES_INSERT_OENTITY_INSERT_OENTITY_INSERT_OENTITY_INSERT_OENTITY_INSERT_OENTITY_INSERT ) ') CHÈN VÀO GIÁ TRỊ TestIdentity (Id, Col1) (1,' Hàng được chèn đầu tiên (INDENTITY_INSERT_OFF) ') SET IDENTITY_INSERT TestIdentity OFFSELECT * FROM TestIdentity
Khi chúng tôi điều hướng tab Chỉ mục của bảng TestIdentity trong trình khám phá đối tượng, chúng tôi có thể tìm ra một chỉ mục nhóm duy nhất được tạo bởi ràng buộc khóa chính. Ràng buộc này thực thi các giá trị duy nhất cho cột Id.
Kết luận
Trong bài viết này, chúng tôi đã thảo luận về các khái niệm cơ bản và phương pháp sử dụng của thuộc tính Identity SQL Server và cột Identity.
Tài liệu tham khảo
- TẠO BẢNG (Transact-SQL) IDENTITY (Thuộc tính)
- Tạo các khóa chính