SQLite
 sql >> Teknologi Basis Data >  >> RDS >> SQLite

Ubah Nilai NULL ke Nilai Default Kolom saat Memasukkan Data di SQLite

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sinkronisasi database SQLite offline dengan database MySQL online

  2. Hapus Duplikat dari Count() Hasil di SQLite

  3. Apakah kinerja SQLite akan menurun jika ukuran database lebih besar dari 2 gigabyte?

  4. Android - Tampilkan nama pengguna dari database sqlite setelah login di textView

  5. java.lang.IllegalArgumentException:kolom '_id' tidak ada