SQLite
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> SQLite

Ràng buộc KIỂM TRA SQLite

Tóm tắt :trong hướng dẫn này, bạn sẽ học cách sử dụng SQLite CHECK ràng buộc xác thực dữ liệu trước khi chèn hoặc cập nhật.

Giới thiệu về SQLite CHECK ràng buộc

SQLite CHECK các ràng buộc cho phép bạn xác định các biểu thức để kiểm tra các giá trị bất cứ khi nào chúng được chèn vào hoặc cập nhật trong một cột.

Nếu các giá trị không đáp ứng các tiêu chí được xác định bởi biểu thức, SQLite sẽ đưa ra lỗi vi phạm ràng buộc và hủy bỏ câu lệnh.

CHECK các ràng buộc cho phép bạn xác định các kiểm tra tính toàn vẹn của dữ liệu bổ sung ngoài UNIQUE hoặc NOT NULL để phù hợp với ứng dụng cụ thể của bạn.

SQLite cho phép bạn xác định một CHECK ràng buộc ở cấp cột hoặc cấp bảng.

Câu lệnh sau đây trình bày cách xác định một CHECK ràng buộc ở cấp cột:

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

và câu lệnh sau minh họa cách xác định CHECK ràng buộc ở cấp bảng:

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

Trong cú pháp này, bất cứ khi nào một hàng được chèn vào bảng hoặc một hàng hiện có được cập nhật, biểu thức được liên kết với mỗi CHECK ràng buộc được đánh giá và trả về một giá trị số 0 hoặc 1.

Nếu kết quả là 0, thì một vi phạm ràng buộc đã xảy ra. Nếu kết quả là giá trị khác 0 hoặc NULL, điều đó có nghĩa là không có vi phạm ràng buộc nào xảy ra.

Lưu ý rằng biểu thức của một CHECK ràng buộc không được chứa một truy vấn con.

SQLite CHECK các ví dụ về ràng buộc

Hãy lấy một số ví dụ về việc sử dụng CHECK ràng buộc.

1) Sử dụng SQLite CHECK ràng buộc ở cấp cột ví dụ

Câu lệnh sau tạo một bảng mới có tên 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)

Trong contacts bảng, phone cột có CHECK ràng buộc:

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

CHECK này ràng buộc đảm bảo rằng các giá trị trong phone cột phải có ít nhất 10 ký tự.

Nếu bạn cố gắng thực hiện câu lệnh sau, bạn sẽ gặp lỗi vi phạm ràng buộc:

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

Đây là thông báo lỗi:

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

Lý do là số điện thoại mà bạn cố gắng chèn chỉ có 9 ký tự trong khi số này yêu cầu ít nhất 10 ký tự.

Câu lệnh sau sẽ hoạt động vì giá trị trong phone cột có 13 ký tự, thỏa mãn biểu thức trong CHECK ràng buộc:

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

2) Sử dụng SQLite CHECK các ràng buộc ở ví dụ cấp bảng

Câu lệnh sau tạo một bảng mới có tên 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)

Trong ví dụ này, CHECK ràng buộc được xác định ở cấp bảng:

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

CHECK ràng buộc đảm bảo rằng giá niêm yết luôn lớn hơn hoặc bằng chiết khấu và cả chiết khấu và giá niêm yết đều lớn hơn hoặc bằng không.

Câu lệnh sau vi phạm CHECK hạn chế vì chiết khấu cao hơn giá niêm yết.

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

Câu lệnh sau cũng vi phạm CHECK ràng buộc vì chiết khấu là âm:

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

Thêm CHECK ràng buộc đối với một bảng hiện có

Kể từ phiên bản 3.25.2, SQLite không hỗ trợ thêm CHECK ràng buộc vào một bảng hiện có.

Tuy nhiên, bạn có thể làm theo các bước sau:

Đầu tiên, tạo một bảng mới có cấu trúc giống với bảng mà bạn muốn thêm CHECK hạn chế. Bảng mới cũng phải bao gồm CHECK ràng buộc:

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

Để có được cấu trúc của bảng cũ, bạn có thể sử dụng .schema yêu cầu. Xem hướng dẫn bảng SQLite DESCRIBE để biết thêm thông tin.

Thứ hai, sao chép dữ liệu từ bảng cũ sang bảng mới.

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

Thứ ba, bỏ bảng cũ:

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

Thứ tư, đổi tên bảng mới thành bảng cũ:

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

Để đảm bảo an toàn cho tất cả các tuyên bố trên giao dịch, bạn nên thực hiện tất cả chúng trong một giao dịch như sau:

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)

Trong hướng dẫn này, bạn đã học cách sử dụng CHECK trong SQLite ràng buộc để đảm bảo các giá trị trong một cột hoặc một nhóm cột thỏa mãn một điều kiện được xác định bởi một biểu thức.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhận giá trị trường bằng Con trỏ

  2. SQLite không có cột như vậy

  3. Chèn dữ liệu để ghi vào sqlite

  4. Cách đính kèm tệp .db với một android .apk khác

  5. Làm cách nào tôi có thể đọc dữ liệu từ một DB được mã hóa bằng SQLiteAssetHelper?