Khi bạn cần đảm bảo tính duy nhất của các bản ghi với điều kiện không thể được thể hiện bằng ràng buộc KHÓA CHÍNH hoặc DUY NHẤT, bạn thực sự cần đảm bảo rằng việc kiểm tra sự tồn tại và chèn đang được thực hiện trong một giao dịch. Bạn có thể đạt được điều này bằng cách:
- Sử dụng một câu lệnh SQL để thực hiện kiểm tra và chèn (tùy chọn thứ ba của bạn)
- Sử dụng giao dịch với mức cách ly thích hợp
Tuy nhiên, có một cách thứ tư sẽ giúp bạn cấu trúc mã của mình tốt hơn và cũng làm cho nó hoạt động trong các tình huống mà bạn cần xử lý hàng loạt bản ghi cùng một lúc. Bạn có thể tạo một biến TABLE hoặc một bảng tạm thời, chèn tất cả các bản ghi cần được chèn vào đó và sau đó viết các câu lệnh INSERT, UPDATE và DELETE dựa trên biến này.
Dưới đây là mã (giả) thể hiện cách tiếp cận này:
-- Logic to create the data to be inserted if necessary
DECLARE @toInsert TABLE (idCol INT PRIMARY KEY,dataCol VARCHAR(MAX))
INSERT INTO @toInsert (idCol,dataCol) VALUES (1,'row 1'),(2,'row 2'),(3,'row 3')
-- Logic to insert the data
INSERT INTO realTable (idCol,dataCol)
SELECT TI.*
FROM @toInsert TI
WHERE NOT EXISTS (SELECT 1 FROM realTable RT WHERE RT.dataCol=TI.dataCol)
Trong nhiều tình huống, tôi sử dụng phương pháp này vì nó làm cho mã TSQL dễ đọc hơn, có thể cấu trúc lại và áp dụng các bài kiểm tra đơn vị.