Understanding Key Constraints in SQL for Data Integrity
Master the fundamentals of SQL key constraints to maintain data integrity and streamline database operations with practical implementation tips.

Maintaining accurate, consistent, and reliable data is critical for any database, and SQL constraints play a key role in achieving this. These constraints are rules that define what data can be stored in a table, ensuring it meets specific criteria before being accepted.

Whether applied at the column level (affecting a single column) or the table level (impacting multiple columns), these constraints act as safeguards for your data, reinforcing integrity and preventing errors.
This article will guide you through the importance of SQL constraints, their types, and practical applications, equipping you with the knowledge to build databases that are both robust and efficient.
What Are Key Constraints in SQL?
SQL constraints are rules that define the type of data allowed in a table, ensuring it meets specific criteria. These constraints maintain data accuracy and integrity by enforcing validation during operations like insertions or updates. Primary and foreign key constraints are fundamental to maintaining data integrity in SQL databases.
A primary key uniquely identifies each record in a table and ensures that no duplicate or null values are allowed. This makes it the cornerstone of table structure and retrieval operations. Each table can have only one primary key, which enforces the uniqueness and reliability of its records.
Foreign key constraints establish relationships between tables by linking a column in one table to the primary key of another. They ensure referential integrity by preventing invalid data entries that don’t correspond to the referenced table. This relationship fosters structured, relational databases, enabling seamless joins and consistent data management.
How to Create Constraints in SQL?
SQL constraints can be created using the CREATE TABLE command while defining a new table, or the ALTER TABLE command to modify an existing one. These constraints serve as rules to validate and restrict data being entered into a table, ensuring it meets predefined criteria.
The basic syntax for defining constraints with the CREATE TABLE command includes specifying the table name, column name, data type, and the desired constraint.
1CREATE TABLE table_name (
2 column_name1 data_type(size) constraint_name,
3 column_name2 data_type(size) constraint_name
4);
Here:
- table_name: The name of the table being created.
- column_name1, column_name2: The names of the columns in the table.
- data_type(size): Specifies the data type (e.g., INT, VARCHAR) and size (e.g., VARCHAR(50) for a string up to 50 characters).
- constraint_name: The type of constraint to apply (e.g., NOT NULL, PRIMARY KEY).
Constraints can be added to existing tables using the ALTER TABLE command, but they will only apply if the existing data meets the constraint's conditions.
The syntax for adding constraints with ALTER TABLE is:
1ALTER TABLE table_name
2ADD CONSTRAINT constraint_name column_name data_type(size);
Here:
- ALTER TABLE table_name: Modifies the specified table.
- ADD CONSTRAINT constraint_name: Adds a new constraint to the table.
- column_name data_type(size): Defines the column to which the constraint applies.
These commands allow you to define rules such as preventing duplicates, enforcing relationships, or ensuring specific data formats.
Types of SQL Constraints
SQL constraints ensure data integrity by enforcing rules at the column or table level. Let’s explore the main types of constraints.
NOT NULL Constraint
The NOT NULL constraint ensures critical columns cannot have blank values, making it vital for mandatory data fields like unique identifiers or transaction amounts. It guarantees data completeness and reliability.
Here is a sample code for NOT NULL Constraint:
1CREATE TABLE `project_id.dataset_name.table_name` (
2 Column1_Name DATA_TYPE [NOT NULL],
3 Column2_Name DATA_TYPE [NOT NULL],
4 Column3_Name DATA_TYPE,
5 Column4_Name DATA_TYPE,
6 Column5_Name DATA_TYPE,
7 Column6_Name DATA_TYPE,
8 PRIMARY KEY (PrimaryKey_Column) NOT ENFORCED
9);
Altering a NOT NULL Constraint after Table Creation
After creating a table, you can modify a column's NOT NULL constraint if your database supports it. You can remove the constraint to allow NULL values or add it to enforce that the column must always have a value. This is useful when data validation rules change over time.
1ALTER TABLE `project_id.dataset_name.table_name`
2ALTER COLUMN column_name
3DROP NOT NULL;UNIQUE Constraint
The UNIQUE constraint ensures that no two rows in a table can have the same value in a specified column. Unlike the PRIMARY KEY constraint, which also enforces uniqueness, a table can have multiple UNIQUE constraints but only one PRIMARY KEY.
BigQuery:
1CREATE TABLE `project_id.dataset_name.table_name` (
2 Primary_Key_Column INT64 NOT NULL, -- Intended as UNIQUE
3 Numeric_Column NUMERIC NOT NULL,
4 Text_Column1 STRING NOT NULL,
5 Text_Column2 STRING,
6 Date_Column DATE,
7 Integer_Column INT64
8);
MySQL:
1CREATE TABLE table_name (
2 Primary_Key_Column INT NOT NULL,
3 Numeric_Column DECIMAL(precision, scale) NOT NULL,
4 Text_Column1 VARCHAR(length) NOT NULL,
5 Text_Column2 VARCHAR(length),
6 Date_Column DATE,
7 Integer_Column INT,
8 UNIQUE(Primary_Key_Column)
9);
Altering a UNIQUE Constraint After Table Creation
In some cases, business logic may require ensuring that a combination of two or more columns in a table remains unique. For example, you may need to guarantee that no two rows share the same combination of Column_A and Column_B.
This can be done by adding a UNIQUE constraint to those columns even after the table has already been created.
MySQL / SQL Server / Oracle / MS Access:
1ALTER TABLE table_name
2ADD CONSTRAINT constraint_name UNIQUE(column_name1, column_name2);DEFAULT Constraint
The DEFAULT constraint assigns a predefined value to a column when no value is provided. This ensures consistent data and helps handle scenarios where input values might be missing, avoiding potential errors.
SQL Server / Oracle / MS Access:
1CREATE TABLE table_name (
2 primary_key_column DATA_TYPE NOT NULL UNIQUE,
3 numeric_column DATA_TYPE(precision, scale) NOT NULL,
4 required_text_column VARCHAR(length) NOT NULL,
5 optional_text_column VARCHAR(length) DEFAULT 'default_value',
6 date_column DATE DEFAULT CURRENT_DATE_FUNCTION,
7 integer_column DATA_TYPE
8);
Altering a DEFAULT Constraint After Table Creation
If you need to set a default value for a column after a table has been created, SQL allows you to do this using the ALTER TABLE statement. The exact syntax varies slightly depending on the database system you're using.
MySQL:
1ALTER TABLE table_name
2ALTER column_name SET DEFAULT 'default_value';
SQL Server:
1ALTER TABLE table_name
2ADD CONSTRAINT constraint_name
3DEFAULT 'default_value' FOR column_name;
Oracle:
1ALTER TABLE table_name
2MODIFY column_name DEFAULT 'default_value';
MS Access:
1ALTER TABLE table_name
2ALTER COLUMN column_name SET DEFAULT 'default_value';
CHECK Constraint
The CHECK constraint enforces rules on column values to ensure data adheres to specific business logic. It prevents invalid or corrupt information from being entered, ensuring consistency and accuracy.
MySQL:
1CREATE TABLE table_name (
2 column1_name DATA_TYPE NOT NULL UNIQUE,
3 column2_name DATA_TYPE(precision, scale) NOT NULL,
4 column3_name VARCHAR(length) NOT NULL,
5 column4_name DATA_TYPE CHECK (column4_name BETWEEN min_value AND max_value)
6);
SQL Server / Oracle / MS Access:
1CREATE TABLE table_name (
2 column1 INT NOT NULL UNIQUE,
3 column2 DECIMAL(precision, scale) NOT NULL,
4 column3 VARCHAR(length) NOT NULL,
5 column4 INT CHECK (column4 BETWEEN min_value AND max_value)
6);
Altering a CHECK Constraint After Table Creation
If a column was initially created without a CHECK constraint, you can add one later to enforce specific rules or conditions on the values it accepts. This helps maintain data integrity by restricting invalid or out-of-range inputs.
MySQL / SQL Server / Oracle / MS Access:
1ALTER TABLE table_name
2ADD CHECK (column_name BETWEEN min_value AND max_value);PRIMARY KEY Constraint
The PRIMARY KEY constraint ensures that each row in a table has a unique, non-null identifier, which is essential for maintaining data integrity in relational databases. It automatically prevents both NULL values and duplicate entries in the specified column.
MySQL:
1CREATE TABLE table_name (
2 primary_key_column DATA_TYPE NOT NULL,
3 numeric_column DATA_TYPE(precision, scale) NOT NULL,
4 text_column VARCHAR(length) NOT NULL,
5 date_column DATE,
6 other_column DATA_TYPE,
7 PRIMARY KEY (primary_key_column)
8);
SQL Server / Oracle / MS Access:
1CREATE TABLE table_name (
2 primary_key_column DATA_TYPE NOT NULL PRIMARY KEY,
3 numeric_column DATA_TYPE(precision, scale) NOT NULL,
4 text_column VARCHAR(length) NOT NULL,
5 date_column DATE,
6 other_column DATA_TYPE
7);
Altering a PRIMARY KEY Constraint After Table Creation
If a table was created without a PRIMARY KEY constraint, you can add one later to ensure that each row has a unique and non-null identifier. This is essential for maintaining data consistency and supporting reliable relationships between tables.
MySQL / SQL Server / Oracle / MS Access:
1ALTER TABLE table_name
2ADD PRIMARY KEY (column_name);FOREIGN KEY Constraint
A FOREIGN KEY constraint links two tables in a relational database, establishing a parent-child relationship between the tables. The FOREIGN KEY column in the child table references the PRIMARY KEY column in the parent table, ensuring referential integrity by preventing operations that would break this link.
MySQL:
1CREATE TABLE table_name (
2 primary_key_column DATA_TYPE NOT NULL,
3 column2 VARCHAR(length),
4 column3 VARCHAR(length),
5 foreign_key_column DATA_TYPE,
6 PRIMARY KEY (primary_key_column),
7 FOREIGN KEY (foreign_key_column) REFERENCES parent_table(parent_primary_key)
8);
SQL Server / Oracle / MS Access:
1CREATE TABLE table_name (
2 primary_key_column DATA_TYPE NOT NULL PRIMARY KEY,
3 column2 VARCHAR(length),
4 column3 VARCHAR(length),
5 foreign_key_column DATA_TYPE FOREIGN KEY REFERENCES parent_table(parent_primary_key)
6);Altering a FOREIGN KEY Constraint After Table Creation
If a table was initially created without a FOREIGN KEY constraint, you can add one later to establish a relationship with a parent table. This ensures referential integrity, meaning the values in the child table must correspond to existing values in the parent table's primary key column.
MySQL / SQL Server / Oracle / MS Access:
1ALTER TABLE child_table_name
2ADD FOREIGN KEY (foreign_key_column) REFERENCES parent_table_name(parent_primary_key_column);INDEX Constraint
The INDEX constraint optimizes query performance by allowing the database to locate and retrieve rows more efficiently. Indexes act as pointers, speeding up searches on large datasets without modifying the data.
MySQL / SQL Server / Oracle / MS Access:
1CREATE INDEX index_name
2ON table_name (column_name);Common Challenges of Key Constraints in SQL
While key constraints ensure data integrity and consistency, they can present challenges during data modifications. Understanding these issues is crucial to managing and troubleshooting database constraints effectively.
- Disabled or NOCHECK Constraints: Constraints disabled with NOCHECK or added without validation can cause data inconsistencies and violations.
- Deployment Order for Foreign Key Constraints: Foreign key constraints require a specific order of deployment; referencing non-existent parent tables leads to errors.
- Violations During Bulk Data Operations: Bulk imports or updates bypass constraints, leading to violations when constraints are re-enabled.
- Cascading Foreign Key Actions and Binary Logs: Cascading actions like ON DELETE CASCADE or ON UPDATE CASCADE are not logged in MySQL binary logs, causing replication issues.
- Schema Reverts with Foreign Key Constraints: Reverting schema changes with foreign key relationships can result in orphaned rows and inconsistent data.
- Concurrent Online DDL Operations with Foreign Keys: Concurrent schema updates involving foreign keys can cause locking issues or data inconsistencies in child tables.
Best Practices for Effectively Using SQL Constraints
SQL constraints are powerful tools to ensure data integrity and consistency. Following best practices helps you optimize their use, prevent errors, and maintain a well-structured, reliable database.
Understanding NULL and NOT NULL in SQL Constraints
Apply NULL constraints for optional fields where data might be missing or uncertain. Use NOT NULL constraints for mandatory fields to ensure critical information, such as IDs or names, is always present. This balance enhances data integrity while accommodating scenarios requiring flexibility for incomplete entries.
Using Default Values in SQL Columns for Consistency
Setting default values ensures columns always have meaningful data, even when specific inputs are missing. For instance, in a user table, assigning a default age of 25 can represent users 25 or older when no age is provided. This simplifies queries and maintains data consistency.
Balancing Read and Write Operations with SQL Indexes
Use indexes to optimize read performance for SELECT queries, allowing faster data retrieval without directly accessing the disk. However, balancing their use as indexes can slow down write operations like INSERTs, UPDATEs, and DELETEs, and occupy additional storage space. Apply them strategically for critical queries.
Using PRIMARY KEY Constraints for Auto-Increment in SQL
Apply PRIMARY KEY constraints with auto-increment to generate unique identifiers for each row automatically. This is ideal for ID columns, simplifying data management. In MySQL, pair PRIMARY KEY with AUTO_INCREMENT; other database systems may have similar mechanisms. Choose the approach that best fits your database requirements.
Automate Your Reporting with OWOX Reports
Managing data and generating reports manually can be time-consuming and prone to errors. OWOX Reports streamlines this process by automating data collection, integration, and visualization. With seamless integration across popular platforms like Google BigQuery, OWOX ensures accurate and up-to-date reports.
Beyond efficiency, OWOX Reports empowers teams with customizable dashboards and real-time insights tailored to their business needs. Whether tracking KPIs, analyzing trends, or forecasting, OWOX provides a reliable solution to simplify reporting and drive data-driven strategies for your organization.
Frequently asked questions
A primary key is a unique identifier for each record in a table, ensuring no duplicate or NULL values in the column(s) it defines. A foreign key, on the other hand, establishes a relationship between two tables by referencing the primary key in another table, enforcing referential integrity.
No, a table can have only one primary key. However, this primary key can consist of multiple columns, known as a composite primary key.
Foreign keys ensure that the value in a column or set of columns in the child table matches the primary key in the parent table. This prevents orphaned records and ensures that relationships between tables remain consistent.
If you delete a record that is referenced by a foreign key, the database enforces the action based on the specified ON DELETE rule. Options include:
- CASCADE: Deletes all related records.
- SET NULL: Sets the foreign key value to NULL in related records.
- NO ACTION/RESTRICT: Prevents the deletion if references exist.
Yes, foreign key columns can contain NULL values if the column is not part of the table's primary key. This indicates that the relationship is optional for those rows.
Primary keys should be stable, simple, and unique, preferably numerical or integer-based for performance. Avoid frequently changing or composite keys unless business requirements necessitate multiple columns for unique identification.
You can add a primary key to an existing table using the ALTER TABLE statement. For example:
ALTER TABLE SalesADD PRIMARY KEY (Sale_ID);
Composite primary keys combine two or more columns to uniquely identify a record when a single column cannot ensure uniqueness. They are ideal for tables with complex relationships requiring unique combinations of multiple attributes.
Indexing foreign key columns enhances lookup speed, while simplifying cascade rules reduces processing overhead. Denormalizing frequently queried data and writing optimized queries with minimal nested joins also improves performance in foreign key operations.


![[GA4] BigQuery Export: How to Connect Step-by-Step](https://cdn.prod.website-files.com/676a9690ef4ec151a69571ff/6a0f4cb2459d23e022c5435a_%5BGA4%5D%20BIGQUERY%20EXPORT.png)




Finally, a tool that doesn't ask business users to learn a new dashboarding UI. Our marketing team already knows Sheets. OWOX just delivers the right data.
Joinable data marts concept was the thing that sold us. We can now use the semantic layer without building one.
Self-hosted the OSS version on Digital Ocean. Zero vendor lock-in. Contributed a Shopify connector back in week two.