Introduction

Referential integrity: consistency across tables. Foreign key: links to primary key of another table. Constraint: enforces relationship. Violation: prevented by database. Foundation: data consistency.

"Referential integrity ties tables together: one-to-many relationships, enforced by foreign keys. Database maintains consistency: no orphan records, no invalid references." -- Relational model

Foreign Key Concept

Definition

Column(s): reference primary key of another table. Value: must exist in referenced table (or NULL). Establishes: one-to-many relationship. Maintained: database enforces.

Example

Employees table: has dept_id (foreign key)
Department table: has dept_id (primary key)

Each employee: references department by dept_id
Constraint: dept_id value must exist in Department table

Notation

FK: foreign key (abbreviated). Shown: in schema diagrams as arrow (pointing to primary key). Syntax: FOREIGN KEY clause in CREATE TABLE.

Self-Referencing

Foreign key: can reference same table. Example: manager_id references employee_id (hierarchical). Enables: recursive relationships.

Foreign Key Constraints

Definition

Rule: column value must exist in referenced table. Insertion: checked (INSERT fails if no match). Update: checked (UPDATE fails if invalid). Deletion: checked (DELETE fails if referenced).

SQL Syntax

CREATE TABLE employees (
 emp_id INT PRIMARY KEY,
 name VARCHAR(100),
 dept_id INT,
 FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

Multi-Column Foreign Key

FOREIGN KEY (year, month) REFERENCES calendar(year, month);

Named Constraint

CONSTRAINT fk_employee_dept FOREIGN KEY (dept_id) REFERENCES departments(dept_id);

Violation Prevention

Insert Violation

INSERT INTO employees (emp_id, name, dept_id)
VALUES (100, 'Alice', 999);

Error: dept_id 999 doesn't exist in departments table
Constraint prevents: invalid state

Update Violation

UPDATE employees SET dept_id = 999 WHERE emp_id = 1;

Error: dept_id 999 invalid
Update rejected: maintaining integrity

Delete Cascade Issue

DELETE FROM departments WHERE dept_id = 10;

Behavior depends: ON DELETE action
 RESTRICT: error (has employees)
 CASCADE: deletes all employees in dept 10
 SET NULL: employees.dept_id becomes NULL

Prevention Strategy

Database enforces: developer doesn't bypass. Errors caught: application handles (user feedback). Consistency: guaranteed.

Cascading Actions

ON DELETE Actions

RESTRICT: error if referenced (default). CASCADE: delete child records. SET NULL: nullify foreign key. SET DEFAULT: use default value.

ON UPDATE Actions

RESTRICT: error if referenced. CASCADE: update child foreign keys. SET NULL: nullify. SET DEFAULT: use default value.

Example Cascade

CREATE TABLE employees (
 ...
 dept_id INT,
 FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
 ON DELETE CASCADE
 ON UPDATE CASCADE
);

Delete department: all employees deleted (cascade)
Update dept_id: all employees' dept_id updated (cascade)

Caution

CASCADE: dangerous (unintended deletions). Careful: design cascades. Document: for understanding. Alternative: RESTRICT + explicit logic.

Orphan Records

Definition

Child record: parent deleted (no valid reference). Orphan: exists without parent. Database prevents (no orphans with constraint). Possible: if constraint disabled (risky).

Example

Without constraint:
 Delete department 10
 Employee records with dept_id=10: orphaned (invalid)

With constraint (RESTRICT):
 Delete fails: error (department has employees)
 Orphans prevented: consistency maintained

Data Corruption

Orphans indicate: constraint violation. Possible causes: disabled constraints, buggy code. Cleanup: find and remove orphans (manual fix, costly).

Prevention

Enable: foreign key constraints (default, standard). Verify: on startup (check existing data). Audit: periodic validation.

Enforcement Mechanisms

Database Level

Triggered: on DML operations (INSERT, UPDATE, DELETE). Check: primary key exists in referenced table. Index: on referenced key (fast lookup). Automatic: transparent to application.

Deferred Checking

Immediate: checked after each statement. Deferred: checked at transaction end. Flexibility: allows temporary violations (complex multi-step transactions). Careful: ensure final state valid.

Application Level

Validation: before INSERT/UPDATE (redundant, but safe). Error handling: catch database errors (graceful). Logging: track violations (audit trail).

Disabling Constraints

ALTER TABLE employees DISABLE CONSTRAINT fk_employee_dept;
-- Risky: orphans possible

ALTER TABLE employees ENABLE CONSTRAINT fk_employee_dept;
-- Re-enable (may fail if orphans exist)

Complex Scenarios

Circular Foreign Keys

A -> B -> A (mutual references). Allowed: if handled carefully. Insertion: deferred constraints (allow temporary violation). Deletion: careful order.

Self-Referencing Hierarchy

Employee: has manager_id (foreign key to employee_id)
Enables: organizational structure (reporting relationships)
Tree structure: parent-child relationships

Multi-Table Join Dependencies

Complex: multiple foreign keys referencing different tables. Design: ensure no cycles (or handle carefully). Testing: verify cascade behavior.

Soft Deletes

Instead of DELETE: mark as deleted (status column). Foreign key: still references. Advantages: preserves history, easy undo. Disadvantage: logic (must filter deleted).

Practical Examples

Simple One-to-Many

CREATE TABLE departments (
 dept_id INT PRIMARY KEY,
 dept_name VARCHAR(50)
);

CREATE TABLE employees (
 emp_id INT PRIMARY KEY,
 name VARCHAR(100),
 dept_id INT NOT NULL,
 FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
 ON DELETE RESTRICT
);

With Cascading

CREATE TABLE projects (
 project_id INT PRIMARY KEY,
 dept_id INT,
 FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
 ON DELETE CASCADE
);

Delete department: projects deleted automatically

Self-Referencing

CREATE TABLE employees (
 emp_id INT PRIMARY KEY,
 name VARCHAR(100),
 manager_id INT,
 FOREIGN KEY (manager_id) REFERENCES employees(emp_id)
 ON DELETE SET NULL
);

Composite Foreign Key

CREATE TABLE order_items (
 order_id INT NOT NULL,
 item_id INT NOT NULL,
 quantity INT,
 PRIMARY KEY (order_id, item_id),
 FOREIGN KEY (order_id) REFERENCES orders(order_id),
 FOREIGN KEY (item_id) REFERENCES products(item_id)
);

References

  • Ramakrishnan, R., and Gehrke, J. "Database Management Systems." McGraw-Hill, 3rd edition, 2003.
  • Silberschatz, A., Korth, H. F., and Sudarshan, S. "Database System Concepts." McGraw-Hill, 6th edition, 2010.