Jump into concepts and practice - no test required
or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Using Domain Types for Validation in PostgreSQL
📖 Scenario: You are creating a simple database for a small bookstore. You want to ensure that certain fields like ISBN numbers and book prices follow specific rules to keep your data clean and valid.
🎯 Goal: Build a PostgreSQL database schema that uses domain types to validate ISBN numbers and book prices automatically.
📋 What You'll Learn
Create a domain type called isbn_type that only allows 13-character strings.
Create a domain type called price_type that only allows numeric values greater than 0.
Create a table called books with columns id, title, isbn using isbn_type, and price using price_type.
💡 Why This Matters
🌍 Real World
Domain types help keep data clean by automatically checking values when inserting or updating records, reducing errors in real-world databases like bookstores or libraries.
💼 Career
Understanding domain types is useful for database developers and administrators to enforce business rules at the database level, improving data quality and reliability.
Progress0 / 4 steps
1
Create the isbn_type domain
Create a domain called isbn_type as varchar(13) that checks the length of the string is exactly 13 characters.
PostgreSQL
Hint
Use CREATE DOMAIN with a CHECK constraint that uses char_length(VALUE) = 13.
2
Create the price_type domain
Create a domain called price_type as numeric that checks the value is greater than 0.
PostgreSQL
Hint
Use CREATE DOMAIN with a CHECK constraint that ensures VALUE > 0.
3
Create the books table
Create a table called books with columns: id as serial PRIMARY KEY, title as varchar(100), isbn using the isbn_type domain, and price using the price_type domain.
PostgreSQL
Hint
Use CREATE TABLE with the specified columns and domain types.
4
Add a constraint to ensure title is not null
Alter the books table to add a NOT NULL constraint on the title column.
PostgreSQL
Hint
Add NOT NULL after the title varchar(100) column definition.
Practice
(1/5)
1. What is the main purpose of using domain types in PostgreSQL?
easy
A. To speed up query execution by indexing
B. To create custom data types with automatic validation rules
C. To store large binary data efficiently
D. To create temporary tables for session use
Solution
Step 1: Understand what domain types are
Domain types are user-defined data types that include validation rules to ensure data quality.
Step 2: Identify the main purpose
The main purpose is to enforce rules automatically when data is inserted or updated, keeping data clean.
Final Answer:
To create custom data types with automatic validation rules -> Option B
Quick Check:
Domain types = custom types with validation [OK]
Hint: Domains add rules to types, not speed or storage [OK]
Common Mistakes:
Confusing domains with indexing
Thinking domains store large files
Mixing domains with temporary tables
2. Which of the following is the correct syntax to create a domain named positive_int that only allows positive integers?
easy
A. CREATE DOMAIN positive_int AS integer CHECK (VALUE > 0);
B. CREATE DOMAIN positive_int TYPE integer WHERE VALUE > 0;
C. CREATE DOMAIN positive_int AS integer VALIDATE (VALUE > 0);
D. CREATE DOMAIN positive_int AS integer IF VALUE > 0;
Solution
Step 1: Recall the correct syntax for domain creation
The syntax is: CREATE DOMAIN name AS base_type CHECK (condition);
Step 2: Match the syntax with options
CREATE DOMAIN positive_int AS integer CHECK (VALUE > 0); matches the correct syntax with CHECK and VALUE keyword.
Final Answer:
CREATE DOMAIN positive_int AS integer CHECK (VALUE > 0); -> Option A
Quick Check:
CREATE DOMAIN ... AS ... CHECK(...) [OK]
Hint: Use CHECK with VALUE keyword in domain creation [OK]
Common Mistakes:
Using TYPE instead of AS
Using WHERE or VALIDATE instead of CHECK
Missing parentheses around condition
3. Given the domain creation:
CREATE DOMAIN us_zipcode AS varchar(5) CHECK (VALUE ~ '^[0-9]{5}$');
What will happen if you try to insert '1234a' into a table column of type us_zipcode?
medium
A. The insert will succeed because it's a varchar
B. The insert will cause a syntax error
C. The insert will succeed but store NULL instead
D. The insert will fail due to the CHECK constraint violation
Solution
Step 1: Understand the domain's CHECK constraint
The domain requires the value to match exactly 5 digits using a regular expression.
Step 2: Check the value '1234a' against the regex
'1234a' contains a letter, so it does not match the pattern of 5 digits.
Final Answer:
The insert will fail due to the CHECK constraint violation -> Option D
Quick Check:
Regex check fails = insert rejected [OK]
Hint: Regex in CHECK rejects invalid patterns [OK]
Common Mistakes:
Assuming varchar allows any string without checks
Thinking invalid data stores as NULL automatically
Confusing constraint violation with syntax error
4. You have this domain:
CREATE DOMAIN non_empty_text AS text CHECK (LENGTH(VALUE) > 0);
Which of the following INSERT statements will cause an error when inserting into a column of type non_empty_text?
medium
A. INSERT INTO table_name (col) VALUES ('');
B. INSERT INTO table_name (col) VALUES ('world');
C. INSERT INTO table_name (col) VALUES (' ');
D. INSERT INTO table_name (col) VALUES (' hello ');
Solution
Step 1: Understand the CHECK condition
The domain requires text length to be greater than 0, so empty strings fail. Whitespace-only strings pass as they have length > 0.
Step 2: Evaluate each insert value
INSERT INTO table_name (col) VALUES (''); inserts an empty string '', length 0, violating the check.
Final Answer:
INSERT with empty string '' causes error -> Option A
Quick Check:
Empty string fails length > 0 check [OK]
Hint: Empty strings fail length > 0 check [OK]
Common Mistakes:
Thinking whitespace strings fail (they pass)
Assuming empty string is allowed
Confusing syntax errors with constraint errors
5. You want to create a domain rating that stores integers from 1 to 5 inclusive. Which domain definition correctly enforces this range and can be used in multiple tables?
hard
A. CREATE DOMAIN rating AS integer WHERE (VALUE BETWEEN 1 AND 5);
B. CREATE DOMAIN rating AS integer CHECK (VALUE > 1 AND VALUE < 5);
C. CREATE DOMAIN rating AS integer CHECK (VALUE >= 1 AND VALUE <= 5);
D. CREATE DOMAIN rating AS integer CHECK (VALUE IN (1, 2, 3, 4));
Solution
Step 1: Understand the required range
The rating must include 1 and 5, so boundaries are inclusive.
Step 2: Analyze each CHECK condition
The option using WHERE instead of CHECK has invalid syntax. CREATE DOMAIN rating AS integer CHECK (VALUE > 1 AND VALUE < 5); excludes 1 and 5. CREATE DOMAIN rating AS integer CHECK (VALUE >= 1 AND VALUE <= 5); uses >= 1 AND <= 5, correctly including boundaries. CREATE DOMAIN rating AS integer CHECK (VALUE IN (1, 2, 3, 4)); uses IN list which misses 5.
Step 3: Choose the best option for clarity and standard usage
CREATE DOMAIN rating AS integer CHECK (VALUE >= 1 AND VALUE <= 5); is clear, standard, and commonly used for range checks.
Final Answer:
CREATE DOMAIN rating AS integer CHECK (VALUE >= 1 AND VALUE <= 5); -> Option C
Quick Check:
Inclusive range uses >= and <= [OK]
Hint: Use >= and <= for inclusive numeric domain checks [OK]