Navicat Blog

Ensuring Data Integrity in PostgreSQL with Check Constraints Mar 25, 2024 by Robert Gravelle

Data integrity is a critical aspect of any database system, ensuring that the data stored remains accurate, consistent, and meaningful. In PostgreSQL, one powerful tool for maintaining data integrity is the use of check constraints. These constraints allow you to define rules that data must adhere to, preventing the insertion or modification of invalid data. In this article, we'll explore how to use check constraints to validate data in PostgreSQL, using the free DVD Rental Database as a reference.

Understanding Check Constraints

Check constraints are rules that limit the values that can be entered into a column or set of columns in a table. These rules are enforced by the database system, preventing the insertion or modification of rows that violate the specified conditions. Check constraints are defined using the CHECK keyword followed by an expression that evaluates to a Boolean value.

Validating Rental Durations

Let's consider a scenario using a modified version of the "rental" table in the "dvdrental" database that contains a "rental_duration" column. The table definition might appear as follows in the Navicat Table Designer:

rentals_with_rental_period_table_definition (48K)

Now, suppose we want to ensure that the duration of a rental is always greater than zero days. We can achieve this by adding a check constraint to the "rentals_with_rental_period" table as follows:

ALTER TABLE rentals_with_rental_period
ADD CONSTRAINT rental_duration_check
CHECK (rental_duration > 0);
    

In Navicat we can add a check constraint in the "Checks" tab of the Table Designer. We just need to supply an expression and optional name. Navicat will create a unique name for us if we don't supply one!

rental_duration_check_in_navicat (28K)

Upon hitting the Save button, Navicat will either create the check constraint or show an error message if any rows violate the constraint.

With this constraint in place, any attempt to insert or update a row in the "rentals_with_rental_period" table where the rental duration is less than or equal to zero will result in an error, ensuring that only valid rental durations are allowed.

Enforcing Valid Ratings

Another example from the "film" table in the "dvdrental" database involves validating film ratings. Suppose we want to restrict the ratings to only certain values, such as 'G', 'PG', 'PG-13', 'R', or 'NC-17'. We can achieve this with a check constraint:

ALTER TABLE film
ADD CONSTRAINT film_rating_check
CHECK (rating IN ('G', 'PG', 'PG-13', 'R', 'NC-17'));
    

Here is the same constraint in the Navicat Table Designer:

film_rating_check_in_navicat (34K)

Now, any attempt to insert or update a row in the "film" table with a rating that is not one of the specified values will be rejected, ensuring that only valid ratings are allowed.

Handling NULL Values

It's important to note that check constraints are not applied to rows where one or more columns contain a NULL value unless the constraint specifically includes a condition to check for NULL. For example, to enforce that the "rental_rate" column in the "film" table is always greater than zero and not NULL, we would use the following constraint:

ALTER TABLE film
ADD CONSTRAINT film_rental_rate_check
CHECK (rental_rate > 0 AND rental_rate IS NOT NULL);
    

Here is the same constraint in the Navicat Table Designer:

film_rental_rate_check_in_navicat (43K)

Conclusion

Check constraints are a powerful tool for ensuring data integrity in PostgreSQL. By defining rules that data must adhere to, you can prevent the insertion or modification of invalid data, helping to maintain the accuracy and consistency of your database. By incorporating them into your database design, you can build robust and reliable data systems that meet the needs of your organization.

Navicat Blogs
Feed Entries
Blog Archives
Share