Salah satu ekstensi non-standar SQLite untuk SQL adalah ON CONFLICT
klausa.
Klausul ini memungkinkan Anda untuk menentukan apa yang harus terjadi ketika konflik tertentu terjadi karena pelanggaran batasan.
Salah satu hal yang dapat Anda gunakan untuk klausa ini adalah mengganti NULL
nilai dengan nilai default kolom saat memasukkan atau memperbarui data dalam tabel.
Secara default, jika Anda mencoba memasukkan NULL
secara eksplisit ke dalam kolom dengan NOT NULL
kendala, itu akan gagal.
Dan jika Anda mencoba memasukkan NULL
explicitly secara eksplisit ke dalam kolom tanpa a NOT NULL
kendala, lalu NULL
akan ditetapkan ke kolom itu, meskipun ada DEFAULT
klausa.
Namun, Anda dapat menggunakan ON CONFLICT
klausa untuk mengaturnya ke nilai default alih-alih NULL
.
Contoh
Kode berikut menunjukkan apa yang saya maksud.
DROP TABLE IF EXISTS Products;
CREATE TABLE Products(
ProductId INTEGER PRIMARY KEY,
ProductName NOT NULL,
Price NOT NULL ON CONFLICT REPLACE DEFAULT 0.00
);
INSERT INTO Products (ProductId, ProductName, Price) VALUES
(1, 'Widget Holder', NULL);
SELECT * FROM Products;
Dalam contoh ini saya menggunakan ON CONFLICT REPLACE
untuk menyetel NULL
nilai ke nilai default alih-alih NULL
.
Berikut hasil dari SELECT
pernyataan di baris terakhir:
ProductId ProductName Price ---------- ------------- ---------- 1 Widget Holder 0.0
Kita dapat melihat bahwa Harga kolom memiliki nilai default 0,0 meskipun saya mencoba memasukkan NULL
explicitly secara eksplisit .
Mari kita lihat apa yang terjadi jika saya menghapus NOT NULL
kendala.
DROP TABLE IF EXISTS Products;
CREATE TABLE Products(
ProductId INTEGER PRIMARY KEY,
ProductName NOT NULL,
Price DEFAULT 0.00
);
INSERT INTO Products (ProductId, ProductName, Price) VALUES
(1, 'Widget Holder', NULL);
SELECT * FROM Products;
Hasil:
ProductId ProductName Price ---------- ------------- ---------- 1 Widget Holder
Sekarang kolom tersebut berisi NULL
.
Memasukkan NULL Secara Implisit
Penting untuk dicatat bahwa artikel ini terutama berkaitan dengan menyisipkan NULL
secara eksplisit .
Jika Anda mencoba memasukkan NULL
secara implisit , maka contoh sebelumnya akan menghasilkan hasil yang berbeda.
Yang saya maksud adalah, jika Anda tidak menyertakan kolom di INSERT
pernyataan, DEFAULT
kendala akan digunakan secara otomatis. Itu yang DEFAULT
batasannya adalah untuk – memberikan nilai saat Anda tidak memberikannya secara eksplisit.
Inilah yang terjadi ketika saya melakukan itu.
DROP TABLE IF EXISTS Products;
CREATE TABLE Products(
ProductId INTEGER PRIMARY KEY,
ProductName NOT NULL,
Price DEFAULT 0.00
);
INSERT INTO Products (ProductId, ProductName) VALUES
(1, 'Widget Holder');
SELECT * FROM Products;
Hasil:
ProductId ProductName Price ---------- ------------- ---------- 1 Widget Holder 0.0
Jadi yang saya lakukan hanyalah menghapus Harga kolom dari INSERT
pernyataan.
TENTANG KONFLIK untuk Pernyataan INSERT
Contoh pertama menggunakan ON CONFLICT
pada CREATE TABLE
pernyataan.
Tetapi bagaimana jika tabel tidak dibuat dengan ON CONFLICT
klausa?
Untungnya, ada juga cara untuk menggunakannya di INSERT
penyataan.
Sintaksnya sedikit berbeda. Saat digunakan pada INSERT
pernyataan Anda perlu mengganti ON CONFLICT
dengan OR
.
Mari kita ubah kode untuk menggunakan metode ini.
DROP TABLE IF EXISTS Products;
CREATE TABLE Products(
ProductId INTEGER PRIMARY KEY,
ProductName NOT NULL,
Price NOT NULL DEFAULT 0.00
);
INSERT OR REPLACE INTO Products (ProductId, ProductName, Price) VALUES
(1, 'Widget Holder', NULL);
SELECT * FROM Products;
Hasil:
ProductId ProductName Price ---------- ------------- ---------- 1 Widget Holder 0.0
Jadi saya mengganti INSERT INTO
dengan INSERT OR REPLACE INTO
.
Inilah hasilnya jika saya tidak memasukkan klausa itu.
DROP TABLE IF EXISTS Products;
CREATE TABLE Products(
ProductId INTEGER PRIMARY KEY,
ProductName NOT NULL,
Price NOT NULL DEFAULT 0.00
);
INSERT INTO Products (ProductId, ProductName, Price) VALUES
(1, 'Widget Holder', NULL);
SELECT * FROM Products;
Hasil:
Error: NOT NULL constraint failed: Products.Price
Tidak Ada Batasan DEFAULT?
Jika Anda menggunakan ON CONFLICT
klausa pada kolom tanpa DEFAULT
kendala, pernyataan SQL dibatalkan dengan kesalahan SQLITE_CONSTRAINT setiap perubahan yang dibuat oleh pernyataan SQL saat ini akan dibatalkan; tetapi perubahan yang disebabkan oleh pernyataan SQL sebelumnya dalam transaksi yang sama dipertahankan dan transaksi tetap aktif.