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

Cara Melewati Baris yang Melanggar Batasan Saat Memasukkan Data di SQLite

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     


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menampilkan data di RecyclerView

  2. Cara Menampilkan Pengaturan Perintah Dot Saat Ini di SQLite

  3. SQLiteException tidak ada tabel seperti itu:ItemTable saat kompilasi:Select_id,.... dari ItemTable

  4. Kursor SQLiteDatabase kosong hanya di perangkat Android 5.0+

  5. android.database.sqlite.SQLiteCantOpenDatabaseException:kesalahan tidak diketahui (kode 14):Tidak dapat membuka database