Nếu bạn đã từng cố gắng chèn giá trị vào cột nhận dạng trong SQL Server, bạn có thể gặp lỗi như sau:
Không thể chèn giá trị rõ ràng cho cột nhận dạng trong bảng 'Nghệ sĩ' khi IDENTITY_INSERT được đặt thành TẮT.
Điều này là bình thường. Một cột danh tính ở đó là có lý do. Nó tự động điền vào cột với giá trị tăng dần cho mỗi hàng được chèn. Do đó, bạn không cần phải chèn giá trị vào cột đó.
Tuy nhiên, đôi khi bạn do cần phải chèn một giá trị vào một cột nhận dạng. Ví dụ:bạn có thể đưa vào cơ sở dữ liệu những dữ liệu cần giữ lại các giá trị nhận dạng riêng của nó. Nếu đúng như vậy, bạn cần ghi đè IDENTITY
bất động sản. Đây là cách thực hiện.
Bật IDENTITY_INSERT
Bạn có thể ghi đè IDENTITY
bằng cách bật IDENTITY_INSERT
. Điều này cho phép bạn chèn các giá trị của riêng mình vào cột nhận dạng.
Đây là một ví dụ:
SET IDENTITY_INSERT Artists ON; INSERT INTO Artists (ArtistId, ArtistName, ActiveFrom) VALUES (1001, 'AC/DC','1973-01-11'), (1002, 'Allan Holdsworth','1969-01-01'), (1003, 'Buddy Rich','1919-01-01'); SET IDENTITY_INSERT Artists OFF;
Trong ví dụ này, bảng Nghệ sĩ có một cột danh tính (trong trường hợp này, ArtistId là cột danh tính). Để ghi đè IDENTITY
thuộc tính chúng ta chỉ cần đặt trước INSERT
câu lệnh với SET IDENTITY_INSERT Artists ON
. Câu lệnh T-SQL này cho phép bạn nói “Tôi biết bảng này có cột nhận dạng nhưng trong trường hợp này, hãy chèn của tôi các giá trị thay thế ”.
Lưu ý rằng IDENTITY_INSERT
chỉ có thể được bật trên một bảng tại một thời điểm. Do đó, bạn nên tắt IDENTITY_INSERT
ngay sau khi chèn. Thao tác này sẽ đưa nó trở lại trạng thái ban đầu và nó cho phép bạn ghi đè cột nhận dạng trên một bảng khác nếu được yêu cầu.
Ngoài ra, để bật IDENTITY_INSERT
người dùng phải sở hữu bảng hoặc có ALTER
quyền trên bảng.
Sao chép giữa các bảng
Đang bật IDENTITY_INSERT
cũng có thể hữu ích khi bạn sao chép dữ liệu giữa các bảng. Ví dụ:bạn có thể điền một bảng từ một bảng khác.
Dưới đây là ví dụ về việc sao chép dữ liệu từ bảng Artists sang bảng Artists_Archive:
SET IDENTITY_INSERT Artists_Archive ON; INSERT INTO Artists_Archive (ArtistId, ArtistName, ActiveFrom) SELECT ArtistId, ArtistName, ActiveFrom FROM Artists; SET IDENTITY_INSERT Artists_Archive OFF;
Một điều cần lưu ý là, nếu cột nhận dạng có ràng buộc khóa chính, nó sẽ từ chối bất kỳ giá trị nào đã tồn tại trong bảng đích. Vì vậy, bạn cần hoàn toàn chắc chắn rằng việc ghi đè cột nhận dạng là điều bạn chắc chắn muốn làm.