In SQLite, you can create a CHECK
constraint by adding the applicable code within the CREATE TABLE
statement when creating the table.
If a table has a CHECK
constraint on it, and you try to insert or update data that violates the CHECK
constraint, the operation will fail with an error.
Column-Level CHECK Constraint
Here’s an example of creating a column-level CHECK
constraint.
CREATE TABLE Products(
ProductId INTEGER PRIMARY KEY,
ProductName,
Price
CHECK (Price > 0)
);
The part that goes CHECK (Price > 0)
is the CHECK
constraint.
In this case, it specifies that the price must be greater than zero.
Now let’s see what happens if we try to insert data that violates this constraint.
INSERT INTO Products VALUES
(NULL, 'Blue Widget', 0.00);
Result:
Error: CHECK constraint failed: Products
The CHECK
constraint worked as expected.
I get the same result if I try to use a negative value.
INSERT INTO Products VALUES
(NULL, 'Blue Widget', -1.00);
Result:
Error: CHECK constraint failed: Products
But if I increase it to a value that’s greater than zero, then the INSERT
operation succeeds.
INSERT INTO Products VALUES
(NULL, 'Blue Widget', 1.00);
SELECT * FROM Products;
Result:
ProductId ProductName Price ---------- ----------- ---------- 1 Blue Widget 1.0
Table-Level CHECK Constraint
A table-level CHECK
constraint checks data across the whole row, rather than just a single column. In other words, you can use a table-level constraint to check data from multiple columns.
Here’s an example of a table-level CHECK
constraint.
CREATE TABLE Products(
ProductId INTEGER PRIMARY KEY,
ProductName,
Price,
Discount,
CHECK (Price >= Discount)
);
This table is similar to the first one, except that I’ve added an extra column called Discount.
For the CHECK
constraint, I’m now checking that the price is larger than the discount (we don’t want the possibility of having a discount that’s larger than the actual price).
Here’s what happens if I try to insert a discount that’s larger than the price.
INSERT INTO Products VALUES
(NULL, 'Blue Widget', 1.00, 2.00);
Result:
Error: CHECK constraint failed: Products
If I adjust the discount so that it’s lower than the price, it’s inserted successfully.
INSERT INTO Products VALUES
(NULL, 'Blue Widget', 1.00, 0.50);
SELECT * FROM Products;
Result:
ProductId ProductName Price Discount ---------- ----------- ---------- ---------- 1 Blue Widget 1.0 0.5