Navicat Blog

Exploring Different Types of Constraints in PostgreSQL May 3, 2024 by Robert Gravelle

One of PostgreSQL's key features is the ability to enforce various constraints on data, ensuring data integrity and reliability. Today's blog article will provide an overview of PostgreSQL's various constraint types and explore their usage with examples from the free "dvdrental" sample database.

1. Check Constraints:

Check constraints allow you to specify conditions that must be met for a column when inserting or updating data. This ensures that only valid data is stored in the database. For instance, if you have a "customers" table and want to ensure that the age of a customer is at least 18, you can add a check constraint like this:

ALTER TABLE customers
ADD CONSTRAINT check_age CHECK (age >= 18);

2. Not-Null Constraints:

Not-null constraints ensure that a column cannot contain null values. For example, in the "customers" table, if you want to ensure that every customer has a valid email address, you can enforce a not-null constraint on the email column like this:

ALTER TABLE customers

3. Unique Constraints:

Unique constraints ensure that the values in a column or a group of columns are unique across all the rows in a table. This is often used for fields like usernames or email addresses to avoid duplication. For instance, in the "customers" table, if you want to ensure that each customer has a unique email address, you can add a unique constraint like this:

ALTER TABLE customers
ADD CONSTRAINT unique_email UNIQUE (email);

4. Primary Keys:

A primary key is a combination of unique and not-null constraints. It uniquely identifies each record in a table and ensures data integrity. In the "customers" table, you might have a column named "customer_id" that serves as a primary key:

ALTER TABLE customers
ADD CONSTRAINT pk_customer_id PRIMARY KEY (customer_id);

5. Foreign Keys:

Foreign keys establish a relationship between two tables by enforcing referential integrity. They ensure that values in one table's column match values in another table's column. For example, in the "rental" table, if you want to ensure that every rental record references a valid customer, you can add a foreign key constraint like this:

ADD CONSTRAINT fk_customer_id
FOREIGN KEY (customer_id)
REFERENCES customers(customer_id);

6. Exclusion Constraints:

Exclusion constraints ensure that no two rows in a table satisfy a specified predicate. This allows you to define custom constraints beyond simple unique or check constraints. For example, you might have a "bookings" table where you want to ensure that no two bookings for the same room overlap in time:

ALTER TABLE bookings
ADD CONSTRAINT exclude_overlapping_bookings
EXCLUDE USING GIST (room_id WITH =, booking_range WITH &&);

Constraints in Navicat

Navicat for PostgreSQL 16 offers an easy-to-use graphical Table Designer for creating and managing PostgreSQL constraints:


Primary Key constraints are created when you add a key icon to one or more fields by clicking in the Key column. Other constraints are found on their associated tab.


PostgreSQL provides several different types of constraints to maintain data integrity and enforce business rules. Understanding these constraints and how to use them effectively is essential for designing robust and reliable database schemas.

Looking for an easy-to-use graphical tool for PostgreSQL database development? Navicat 16 For PostgreSQL has got you covered. Click here to download the fully functioning application for a free 14 day trial!

Navicat Blogs
Feed Entries
Blog Archives