Di SQLite, saat Anda mencoba menyisipkan beberapa baris ke dalam tabel, dan salah satu baris tersebut melanggar batasan pada tabel tersebut, operasi akan gagal.
Bagaimanapun, inilah yang diharapkan, untuk itulah batasannya.
Tetapi bagaimana jika Anda hanya ingin mengabaikan baris yang melanggar batasan? Dengan kata lain, jika sebuah baris melanggar batasan, Anda ingin SQLite melewati baris itu, lalu melanjutkan pemrosesan baris berikutnya, dan seterusnya.
Untungnya, ada cara mudah untuk melakukannya di SQLite.
Klausul KONFLIK
SQLite memiliki ON CONFLICT
klausa yang memungkinkan Anda menentukan cara menangani konflik kendala. Lebih khusus lagi, ini berlaku untuk UNIQUE
, NOT NULL
, CHECK
, dan PRIMARY KEY
batasan (tetapi bukan FOREIGN KEY
kendala).
ON CONFLICT
klausa digunakan dalam CREATE TABLE
pernyataan, tetapi saat memasukkan data, klausa diganti dengan OR
.
Oleh karena itu, Anda dapat menggunakan klausa ini untuk menentukan cara menangani pelanggaran batasan saat memasukkan data.
Ada lima kemungkinan nilai yang dapat Anda gunakan dengan klausa ini:
ROLLBACK
ABORT
FAIL
IGNORE
REPLACE
Untuk tujuan artikel ini, kami akan menggunakan IGNORE
pilihan.
Menggunakan IGNORE
menyebabkan SQLite melewatkan satu baris yang berisi pelanggaran batasan dan melanjutkan pemrosesan baris berikutnya seolah-olah tidak ada yang salah.
Contoh
Berikut CREATE TABLE
pernyataan untuk tabel yang disebut Produk :
CREATE TABLE Products(
ProductId INTEGER PRIMARY KEY,
ProductName NOT NULL,
Price
);
Perhatikan bahwa tabel ini menyertakan NOT NULL
batasan pada ProductName kolom.
Sekarang mari kita coba memasukkan data yang melanggar batasan tersebut.
INSERT INTO Products VALUES
(1, 'Widget Holder', 139.50),
(2, NULL, 11.00),
(3, 'Widget Stick', 89.75);
Hasil:
Error: NOT NULL constraint failed: Products.ProductName
Tidak mengherankan, kami mendapatkan kesalahan yang menunjukkan bahwa NOT NULL
batasan dilanggar.
Sekarang mari kita lihat berapa banyak baris yang dimasukkan ke dalam tabel.
SELECT COUNT(*) FROM Products;
Hasil:
0
Jadi kita tahu bahwa hanya baris kedua yang melanggar batasan, tetapi ini mencegah apa pun data tidak dimasukkan.
Kita dapat mengubahnya dengan menambahkan OR IGNORE
ke INSERT
. kami pernyataan:
INSERT OR IGNORE INTO Products VALUES
(1, 'Widget Holder', 139.50),
(2, NULL, 11.00),
(3, 'Widget Stick', 89.75);
Itu saja yang diperlukan. Menjalankan kode ini tidak mengakibatkan error seperti kode sebelumnya. Menjalankan kode ini akan menghasilkan data yang baik yang dimasukkan, dan data yang buruk akan diabaikan.
Sekarang jika kita menjalankan SELECT
pernyataan terhadap tabel, kita dapat melihat bahwa data yang baik sebenarnya dimasukkan.
SELECT * FROM Products;
Hasil:
ProductId ProductName Price ---------- ------------- ---------- 1 Widget Holder 139.5 3 Widget Stick 89.75