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

SQLite CHECK kendala

Ringkasan :dalam tutorial ini, Anda akan mempelajari cara menggunakan SQLite CHECK kendala untuk memvalidasi data sebelum memasukkan atau memperbarui.

Pengantar SQLite CHECK kendala

SQLite CHECK batasan memungkinkan Anda untuk mendefinisikan ekspresi untuk menguji nilai setiap kali dimasukkan ke dalam atau diperbarui dalam kolom.

Jika nilai tidak memenuhi kriteria yang ditentukan oleh ekspresi, SQLite akan mengeluarkan pelanggaran batasan dan membatalkan pernyataan.

CHECK batasan memungkinkan Anda untuk menentukan pemeriksaan integritas data tambahan di luar UNIQUE atau NOT NULL agar sesuai dengan aplikasi spesifik Anda.

SQLite memungkinkan Anda untuk menentukan CHECK kendala di tingkat kolom atau tingkat tabel.

Pernyataan berikut menunjukkan cara mendefinisikan CHECK kendala di tingkat kolom:

CREATE TABLE table_name(
    ...,
    column_name data_type CHECK(expression),
    ...
);
Code language: SQL (Structured Query Language) (sql)

dan pernyataan berikut mengilustrasikan cara mendefinisikan CHECK kendala di tingkat tabel:

CREATE TABLE table_name(
    ...,
    CHECK(expression)
);
Code language: SQL (Structured Query Language) (sql)

Dalam sintaks ini, setiap kali baris dimasukkan ke dalam tabel atau baris yang ada diperbarui, ekspresi yang terkait dengan setiap CHECK kendala dievaluasi dan mengembalikan nilai numerik 0 atau 1.

Jika hasilnya nol, maka terjadi pelanggaran kendala. Jika hasilnya bukan nol atau NULL, berarti tidak terjadi pelanggaran batasan.

Perhatikan bahwa ekspresi CHECK batasan tidak boleh berisi subkueri.

SQLite CHECK contoh kendala

Mari kita ambil beberapa contoh penggunaan CHECK kendala.

1) Menggunakan SQLite CHECK kendala pada contoh tingkat kolom

Pernyataan berikut membuat tabel baru bernama contacts :

CREATE TABLE contacts (
    contact_id INTEGER PRIMARY KEY,
    first_name TEXT    NOT NULL,
    last_name  TEXT    NOT NULL,
    email      TEXT,
    phone      TEXT    NOT NULL
                    CHECK (length(phone) >= 10) 
);
Code language: SQL (Structured Query Language) (sql)

Di contacts meja, phone kolom memiliki CHECK kendala:

CHECK (length(phone) >= 10) 
Code language: SQL (Structured Query Language) (sql)

Ini CHECK kendala memastikan bahwa nilai dalam phone kolom minimal harus 10 karakter.

Jika Anda mencoba mengeksekusi pernyataan berikut, Anda akan mendapatkan kesalahan pelanggaran kendala:

INSERT INTO contacts(first_name, last_name, phone)
VALUES('John','Doe','408123456');Code language: SQL (Structured Query Language) (sql)

Berikut adalah pesan kesalahannya:

Result: CHECK constraint failed: contacts
Code language: SQL (Structured Query Language) (sql)

Alasannya adalah bahwa nomor telepon yang Anda coba masukkan hanya memiliki 9 karakter, sementara itu membutuhkan setidaknya 10 karakter.

Pernyataan berikut harus berfungsi karena nilai di phone kolom memiliki 13 karakter, yang memenuhi ekspresi di CHECK kendala:

INSERT INTO contacts(first_name, last_name, phone)
VALUES('John','Doe','(408)-123-456');Code language: SQL (Structured Query Language) (sql)

2) Menggunakan SQLite CHECK kendala pada contoh tingkat tabel

Pernyataan berikut membuat tabel baru bernama products :

CREATE TABLE products (
    product_id   INTEGER         PRIMARY KEY,
    product_name TEXT            NOT NULL,
    list_price   DECIMAL (10, 2) NOT NULL,
    discount     DECIMAL (10, 2) NOT NULL
                                DEFAULT 0,
    CHECK (list_price >= discount AND 
        discount >= 0 AND 
        list_price >= 0) 
);
Code language: SQL (Structured Query Language) (sql)

Dalam contoh ini, CHECK batasan didefinisikan pada tingkat tabel:

CHECK (list_price >= discount AND 
            discount >= 0 AND 
            list_price >= 0) Code language: SQL (Structured Query Language) (sql)

CHECK kendala memastikan bahwa harga jual selalu lebih besar atau sama dengan diskon dan diskon dan harga jual lebih besar atau sama dengan nol.

Pernyataan berikut melanggar CHECK kendala karena diskon lebih tinggi dari harga jual.

INSERT INTO products(product_name, list_price, discount)
VALUES('New Product',900,1000);    Code language: SQL (Structured Query Language) (sql)

Pernyataan berikut juga melanggar CHECK kendala karena diskonnya negatif:

INSERT INTO products(product_name, list_price, discount)
VALUES('New XFactor',1000,-10);    Code language: SQL (Structured Query Language) (sql)

Menambahkan CHECK batasan ke tabel yang ada

Pada versi 3.25.2, SQLite tidak mendukung penambahan CHECK batasan ke tabel yang ada.

Namun, Anda dapat mengikuti langkah-langkah berikut:

Pertama, buat tabel baru yang strukturnya sama dengan tabel yang ingin Anda tambahkan CHECK paksaan. Tabel baru juga harus menyertakan CHECK kendala:

CREATE TABLE new_table (
    [...],
    CHECK ([...])
);
Code language: SQL (Structured Query Language) (sql)

Untuk mendapatkan struktur tabel lama, Anda dapat menggunakan .schema memerintah. Lihat tutorial tabel DESCRIBE SQLite untuk informasi lebih lanjut.

Kedua, salin data dari tabel lama ke tabel baru.

INSERT INTO new_table SELECT * FROM old_table;Code language: SQL (Structured Query Language) (sql)

Ketiga, jatuhkan tabel lama:

DROP TABLE old_table;Code language: SQL (Structured Query Language) (sql)

Keempat, ganti nama tabel baru menjadi yang lama:

ALTER TABLE new_table RENAME TO old_table;Code language: SQL (Structured Query Language) (sql)

Untuk membuat semua pernyataan di atas aman untuk transaksi, Anda harus mengeksekusi semuanya dalam transaksi seperti ini:

BEGIN;
-- create a new table 
CREATE TABLE new_table (
    [...],
    CHECK ([...])
);
-- copy data from old table to the new one
INSERT INTO new_table SELECT * FROM old_table;

-- drop the old table
DROP TABLE old_table;

-- rename new table to the old one
ALTER TABLE new_table RENAME TO old_table;

-- commit changes
COMMIT;
Code language: SQL (Structured Query Language) (sql)

Dalam tutorial ini, Anda telah belajar bagaimana menggunakan SQLite CHECK batasan untuk memastikan nilai dalam kolom atau grup kolom memenuhi kondisi yang ditentukan oleh ekspresi.


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

  2. Mencoba membuka kembali objek sqlitedatabase yang sudah ditutup

  3. Ambil database atau file lain dari Penyimpanan Internal menggunakan run-as

  4. Menambah nilai 'id' secara otomatis saat memasukkan ke sqlite

  5. Tabel isi sebelumnya ActiveAndroid menggunakan migrasi skema