Constraints


Learn how PRIMARY KEY, FOREIGN KEY, NOT NULL, UNIQUE, CHECK, and DEFAULT values ensure data integrity, consistency, and optimize your Oracle database design.

 

Table Constraints

PRIMARY KEY

The PRIMARY KEY constraint uniquely identifies each row in a table. It ensures that all values in the column(s) are unique and not null, serving as the principal identifier for records.

Example 1: PRIMARY KEY on a Single Column

CREATE TABLE departments (
    dept_id NUMBER(4) PRIMARY KEY, -- Defines dept_id as the primary key
    dept_name VARCHAR2(30) NOT NULL
);

Explanation This code creates a departments table where dept_id is the PRIMARY KEY, ensuring each department has a unique and non-null identifier.

Example 2: PRIMARY KEY as a Table Constraint

CREATE TABLE employees (
    employee_id NUMBER(6),
    first_name VARCHAR2(20),
    last_name VARCHAR2(25) NOT NULL,
    CONSTRAINT pk_employee_id PRIMARY KEY (employee_id) -- Defines primary key at table level
);

Explanation This example defines the PRIMARY KEY for employee_id at the table level, providing a named constraint pk_employee_id.

Example 3: Composite PRIMARY KEY

CREATE TABLE order_items (
    order_id NUMBER(6),
    item_id NUMBER(4),
    quantity NUMBER(3),
    CONSTRAINT pk_order_item PRIMARY KEY (order_id, item_id) -- Composite primary key on two columns
);

Explanation Here, order_id and item_id together form a PRIMARY KEY, ensuring unique combinations for each order item.

Example 4: Adding PRIMARY KEY to Existing Table

ALTER TABLE products
ADD CONSTRAINT pk_product_id PRIMARY KEY (product_id); -- Adds primary key to an existing table

Explanation This SQL statement adds a PRIMARY KEY constraint named pk_product_id to the product_id column of the products table.

Example 5: Violating PRIMARY KEY Constraint

INSERT INTO departments (dept_id, dept_name) VALUES (10, 'IT');
INSERT INTO departments (dept_id, dept_name) VALUES (10, 'HR'); -- This will fail (duplicate key)

Explanation The second INSERT statement will raise an error because dept_id 10 already exists, violating the PRIMARY KEY constraint.

 

FOREIGN KEY

The FOREIGN KEY constraint establishes a link between two tables, ensuring referential integrity. It ensures that values in a column (or set of columns) in the referencing table match values in the primary key or unique key of the referenced table.

Example 1: Basic FOREIGN KEY Definition

CREATE TABLE employees (
    employee_id NUMBER(6) PRIMARY KEY,
    first_name VARCHAR2(20),
    dept_id NUMBER(4),
    CONSTRAINT fk_dept_id FOREIGN KEY (dept_id) REFERENCES departments (dept_id) -- Foreign key referencing departments
);

Explanation This code creates an employees table with dept_id as a FOREIGN KEY that references the dept_id (primary key) in the departments table.

Example 2: FOREIGN KEY with ON DELETE CASCADE

CREATE TABLE orders (
    order_id NUMBER(6) PRIMARY KEY,
    customer_id NUMBER(6),
    CONSTRAINT fk_customer_id FOREIGN KEY (customer_id) REFERENCES customers (customer_id) ON DELETE CASCADE -- Deletes child rows when parent is deleted
);

Explanation ON DELETE CASCADE ensures that if a row in the customers table is deleted, all corresponding orders in the orders table are also deleted.

Example 3: FOREIGN KEY with ON DELETE SET NULL

CREATE TABLE tasks (
    task_id NUMBER(6) PRIMARY KEY,
    task_name VARCHAR2(50),
    assigned_to_employee_id NUMBER(6),
    CONSTRAINT fk_assigned_emp FOREIGN KEY (assigned_to_employee_id) REFERENCES employees (employee_id) ON DELETE SET NULL -- Sets foreign key to NULL when parent is deleted
);

Explanation ON DELETE SET NULL means if an employee is deleted, their assigned_to_employee_id in the tasks table will be set to NULL.

Example 4: Adding FOREIGN KEY to Existing Table

ALTER TABLE products
ADD CONSTRAINT fk_category_id FOREIGN KEY (category_id) REFERENCES categories (category_id); -- Adds a foreign key to an existing table

Explanation This SQL statement adds a FOREIGN KEY constraint named fk_category_id to the products table, linking it to the categories table.

Example 5: Violating FOREIGN KEY Constraint

INSERT INTO employees (employee_id, first_name, dept_id)
VALUES (200, 'Alice', 999); -- This will fail (dept_id 999 does not exist in departments)

Explanation This INSERT statement will fail because dept_id 999 does not exist in the departments table, violating the FOREIGN KEY constraint.

 

NOT NULL

The NOT NULL constraint ensures that a column cannot contain NULL values. This is crucial for columns that must always have a value, such as names or identifiers.

Example 1: NOT NULL on a Single Column

CREATE TABLE suppliers (
    supplier_id NUMBER(4) PRIMARY KEY,
    supplier_name VARCHAR2(50) NOT NULL -- supplier_name cannot be NULL
);

Explanation This code defines supplier_name as NOT NULL, requiring a value for every supplier record.

Example 2: Adding NOT NULL to Existing Column

ALTER TABLE customers
MODIFY (customer_name VARCHAR2(50) NOT NULL); -- Adds NOT NULL to an existing column

Explanation This SQL statement modifies the customer_name column in the customers table to enforce NOT NULL.

Example 3: Violating NOT NULL Constraint

INSERT INTO suppliers (supplier_id, supplier_name) VALUES (1, 'Acme Corp');
INSERT INTO suppliers (supplier_id, supplier_name) VALUES (2, NULL); -- This will fail (supplier_name cannot be NULL)

Explanation The second INSERT statement will fail because it attempts to insert a NULL value into the supplier_name column, which is defined as NOT NULL.

Example 4: NOT NULL in Composite Key (Implicit)

CREATE TABLE registrations (
    student_id NUMBER,
    course_id NUMBER,
    CONSTRAINT pk_registration PRIMARY KEY (student_id, course_id) -- Both columns are implicitly NOT NULL
);

Explanation When columns are part of a PRIMARY KEY, they are implicitly NOT NULL by definition.

Example 5: Dropping NOT NULL Constraint

ALTER TABLE suppliers
MODIFY (supplier_name VARCHAR2(50) NULL); -- Removes the NOT NULL constraint

Explanation This statement removes the NOT NULL constraint from the supplier_name column, allowing it to accept NULL values.

 

UNIQUE

The UNIQUE constraint ensures that all values in a column or set of columns are unique across all rows in the table. It allows NULL values, unlike a PRIMARY KEY, but only one NULL value is permitted.

Example 1: UNIQUE on a Single Column

CREATE TABLE user_profiles (
    user_id NUMBER(6) PRIMARY KEY,
    username VARCHAR2(30) UNIQUE, -- username must be unique
    email VARCHAR2(100) NOT NULL
);

Explanation This code defines username as UNIQUE, ensuring no two users can have the same username.

Example 2: UNIQUE as a Table Constraint

CREATE TABLE product_codes (
    product_code VARCHAR2(10),
    description VARCHAR2(100),
    CONSTRAINT uk_product_code UNIQUE (product_code) -- Defines unique constraint at table level
);

Explanation This example defines a UNIQUE constraint named uk_product_code on the product_code column at the table level.

Example 3: Composite UNIQUE Key

CREATE TABLE course_offerings (
    course_id NUMBER,
    semester VARCHAR2(10),
    year NUMBER(4),
    CONSTRAINT uk_course_semester UNIQUE (course_id, semester, year) -- Combination of these three must be unique
);

Explanation The combination of course_id, semester, and year must be unique, preventing duplicate course offerings for the same period.

Example 4: Adding UNIQUE to Existing Column

ALTER TABLE user_profiles
ADD CONSTRAINT uk_email UNIQUE (email); -- Adds unique constraint to an existing column

Explanation This SQL statement adds a UNIQUE constraint named uk_email to the email column of the user_profiles table.

Example 5: Violating UNIQUE Constraint

INSERT INTO user_profiles (user_id, username, email) VALUES (1, 'jdoe', 'john.doe@example.com');
INSERT INTO user_profiles (user_id, username, email) VALUES (2, 'jdoe', 'jane.doe@example.com'); -- This will fail (duplicate username)

Explanation The second INSERT will fail because username 'jdoe' already exists, violating the UNIQUE constraint.

 

CHECK

The CHECK constraint specifies a condition that each row must satisfy. It ensures that the values in a column meet certain criteria, like being within a specific range or adhering to a pattern.

Example 1: CHECK for Positive Value

CREATE TABLE products (
    product_id NUMBER PRIMARY KEY,
    price NUMBER(8,2) CHECK (price > 0) -- Price must be greater than zero
);

Explanation This code defines a CHECK constraint on the price column, ensuring that only positive values can be inserted.

Example 2: CHECK with IN Operator

CREATE TABLE orders (
    order_id NUMBER PRIMARY KEY,
    order_status VARCHAR2(10) CHECK (order_status IN ('PENDING', 'SHIPPED', 'DELIVERED')) -- Status must be one of the specified values
);

Explanation This example uses a CHECK constraint with the IN operator to restrict order_status to a predefined set of values.

Example 3: CHECK for Date Range

CREATE TABLE events (
    event_id NUMBER PRIMARY KEY,
    event_date DATE,
    CHECK (event_date >= TO_DATE('2024-01-01', 'YYYY-MM-DD')) -- Event date must be after a certain date
);

Explanation This CHECK constraint ensures that event_date is always on or after January 1, 2024.

Example 4: Adding CHECK to Existing Table

ALTER TABLE employees
ADD CONSTRAINT chk_salary CHECK (salary >= 0); -- Adds check constraint to an existing column

Explanation This SQL statement adds a CHECK constraint named chk_salary to the salary column, requiring non-negative values.

Example 5: Violating CHECK Constraint

INSERT INTO products (product_id, price) VALUES (1, 10.99);
INSERT INTO products (product_id, price) VALUES (2, -5.00); -- This will fail (price must be > 0)

Explanation The second INSERT statement will fail because the price value is negative, violating the CHECK constraint.

 

DEFAULT Values

DEFAULT values automatically assign a predefined value to a column if no value is explicitly provided during an INSERT operation. This ensures consistency and simplifies data entry.

Example 1: DEFAULT Value for Numeric Column

CREATE TABLE inventory (
    product_id NUMBER PRIMARY KEY,
    product_name VARCHAR2(50),
    stock_quantity NUMBER DEFAULT 0 -- Defaults to 0 if not specified
);

Explanation This code sets the stock_quantity to 0 by DEFAULT if no value is provided during an insert.

Example 2: DEFAULT Value for Date Column

CREATE TABLE audit_trail (
    log_id NUMBER PRIMARY KEY,
    action_description VARCHAR2(200),
    log_timestamp TIMESTAMP DEFAULT SYSTIMESTAMP -- Defaults to current timestamp
);

Explanation The log_timestamp column will automatically be populated with the current system timestamp if not explicitly provided.

Example 3: DEFAULT Value for Character Column

CREATE TABLE tasks (
    task_id NUMBER PRIMARY KEY,
    task_description VARCHAR2(100),
    status VARCHAR2(20) DEFAULT 'NEW' -- Defaults to 'NEW'
);

Explanation If status is not specified during an INSERT, it will default to the string 'NEW'.

Example 4: Altering Column to Add DEFAULT

ALTER TABLE employees
MODIFY (hire_date DATE DEFAULT SYSDATE); -- Adds default value to an existing column

Explanation This SQL statement modifies the hire_date column in the employees table to automatically set SYSDATE as its default value.

Example 5: Inserting with and without DEFAULT

INSERT INTO inventory (product_id, product_name, stock_quantity) VALUES (1, 'Laptop', 50); -- Explicit value
INSERT INTO inventory (product_id, product_name) VALUES (2, 'Mouse'); -- stock_quantity will default to 0

Explanation The first INSERT provides an explicit stock_quantity. The second INSERT relies on the DEFAULT value for stock_quantity, which will be 0.