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.