Ketika Anda perlu menjamin keunikan record pada suatu kondisi yang tidak dapat dinyatakan dengan batasan UNIQUE atau PRIMARY KEY, Anda memang perlu memastikan bahwa pemeriksaan keberadaan dan penyisipan dilakukan dalam satu transaksi. Anda dapat mencapainya dengan:
- Menggunakan satu pernyataan SQL untuk melakukan pemeriksaan dan penyisipan (opsi ketiga Anda)
- Menggunakan transaksi dengan tingkat isolasi yang sesuai
Namun, ada cara keempat yang akan membantu Anda menyusun kode dengan lebih baik dan juga membuatnya berfungsi dalam situasi di mana Anda perlu memproses sekumpulan catatan sekaligus. Anda dapat membuat variabel TABLE atau tabel sementara, menyisipkan semua record yang perlu disisipkan di sana dan kemudian menulis pernyataan INSERT, UPDATE dan DELETE berdasarkan variabel ini.
Di bawah ini adalah kode (semu) yang menunjukkan pendekatan ini:
-- 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)
Dalam banyak situasi saya menggunakan pendekatan ini karena membuat kode TSQL lebih mudah dibaca, memungkinkan untuk melakukan refactor dan menerapkan unit test.