We were recently working on an implementation and had to introduce a couple of CHECK constraints to maintain logical integrity of the database with respect to the business rules. As we were going through the table design, one of my colleagues asked a very interesting question:
Most of our constraints are quite simple, mostly range checks which involve a maximum of two columns. Is it possible to have a complex CHECK constraint which involves more than two columns?
The answer, quite simply is Yes! CHECK constraints can be complex, provided they continue to be an expression that evaluates to a Boolean value.
Demo
I will take a sample table derived from my post earlier in the week:
USE tempdb ;
GO
--Safety Check
IF OBJECT_ID('dbo.ComplexCheckConstraint', 'U') IS NOT NULL
DROP TABLE dbo.ComplexCheckConstraint ;
GO
--Create the temporary table
CREATE TABLE dbo.ComplexCheckConstraint
(
StartDate DATE,
StartTime TIME,
EndDate DATE,
EndTime TIME,
) ;
GO
Now, let us create a complex CHECK constraint on the table:
USE tempdb;
GO
--Add the complex constraint
ALTER TABLE dbo.ComplexCheckConstraint
ADD CONSTRAINT chk_EndDate CHECK ( (EndDate > StartDate)
OR (EndDate = StartDate AND
EndTime > StartTime)
);
GO
Note that we have five operators (3 comparison operators and 2 logical operators) and four columns (EndDate, StartDate, EndTime and StartTime). To check if the constraint works or not, let us attempt to insert some invalid data into the test table:
USE tempdb;
GO
--Attempt to insert some invalid data
INSERT INTO dbo.ComplexCheckConstraint
(
StartDate,
StartTime,
EndDate,
EndTime
)
VALUES (
'2013-09-19',
'08:00',
'2013-09-19',
'07:00'
) ;
GO
We get the following error, proving that the complex table constraint was created and is in effect.
Msg 547, Level 16, State 0, Line 2
The INSERT statement conflicted with the CHECK constraint "chk_EndDate". The conflict occurred in database "tempdb", table "dbo.ComplexCheckConstraint".
The statement has been terminated.
Attempting to insert valid data works fine and does not produce a violation.
Summary
CHECK constraints help to maintain logical consistencies in the database. They can help validate data with respect to a given pattern and also help in ensuring that the data in a column is well within the acceptable limits as defined by the business – irrespective of the complexity of the requirement.
Further Reading:
- Using Regular Expressions with CHECK constraints [Link]
- Defining CHECK constraints on computed columns [Link]
Until we meet next time,

