Sling Academy
Home/SQLite/Practical Examples of FOREIGN KEYs in SQLite Relationships

Practical Examples of FOREIGN KEYs in SQLite Relationships

Last updated: December 07, 2024

SQLite is a lightweight, serverless, and self-contained SQL database engine. When developing applications, ensuring the integrity and reliability of the database relationships is crucial. One of the pivotal tools for enforcing these relationships in databases is the use of FOREIGN KEYs. In this article, we’ll explore practical examples of using FOREIGN KEYs in SQLite to manage relationships between tables effectively.

Understanding FOREIGN KEYs

In relational database design, a FOREIGN KEY is a column (or a set of columns) that establishes and enforces a link between the data in two tables. The table with the FOREIGN KEY is called the child table, and the table referenced is called the parent table. The FOREIGN KEY in the child table enforces referential integrity by ensuring that row data in the child table corresponds based on the parent table's PRIMARY KEY.

Creating Tables with FOREIGN KEYs

To illustrate FOREIGN KEY usage, consider a simple database for managing an inventory system with two tables: Products and Categories. Each product belongs to one category.

CREATE TABLE Categories (
  CategoryID INTEGER PRIMARY KEY,
  CategoryName TEXT NOT NULL
);

The Categories table is our parent table. Now, let’s create the Products table which will contain a FOREIGN KEY referencing the CategoryID from the Categories table:

CREATE TABLE Products (
  ProductID INTEGER PRIMARY KEY,
  ProductName TEXT NOT NULL,
  CategoryID INTEGER,
  FOREIGN KEY (CategoryID) REFERENCES Categories(CategoryID)
);

In this definition, the CategoryID in the Products table must match an CategoryID in the Categories table or can be NULL, enforcing the connection between these tables.

Inserting Data with FOREIGN KEY Constraints

Let's insert some values into the Categories and Products tables to demonstrate how to maintain database integrity.

INSERT INTO Categories (CategoryID, CategoryName) VALUES (1, 'Electronics'), (2, 'Apparel');

We’ve added two categories. Now, let’s add some products with a reference to these categories:

INSERT INTO Products (ProductID, ProductName, CategoryID) VALUES 
  (101, 'Smartphone', 1),
  (102, 'T-shirt', 2);

These products correctly reference the existing categories by their CategoryID.

Handling FOREIGN KEY Violations

If you attempt to insert or update a row in the Products table with a CategoryID that doesn't exist in the Categories table, SQLite throws an error due to the FOREIGN KEY constraint:

-- This will raise an error
INSERT INTO Products (ProductID, ProductName, CategoryID) VALUES (103, 'Laptop', 3);

Since CategoryID '3' doesn't exist, SQLite ensures that data integrity is enforced by preventing this insertion.

Updating and Deleting DATA with ON UPDATE and ON DELETE

SQLite's FOREIGN KEYs also support actions such as cascading updates or deletions. Let’s add some additional clauses to handle these:

CREATE TABLE Products (
  ProductID INTEGER PRIMARY KEY,
  ProductName TEXT NOT NULL,
  CategoryID INTEGER,
  FOREIGN KEY (CategoryID) REFERENCES Categories(CategoryID) 
  ON DELETE CASCADE 
  ON UPDATE NO ACTION
);

With ON DELETE CASCADE, if a category is removed from the Categories table, all associated products are automatically deleted. Conversely, with ON UPDATE NO ACTION, any attempt to update the CategoryID in Categories table will be halted if related products exist.

SQLite’s FOREIGN KEY constraints are a powerful way to maintain referential integrity between tables, preventing orphan records, and ensuring that relationships remain consistent whenever records are inserted, updated, or deleted. By leveraging these practical examples, you can create robust database schemas tailored for scalable and reliable applications.

Next Article: SQLite UNIQUE Constraint: Ensuring Distinct Records

Previous Article: PRIMARY KEY and AUTOINCREMENT: How They Work Together in SQLite

Series: SQLite Data Types and Constraints

SQLite

You May Also Like

  • How to use regular expressions (regex) in SQLite
  • SQLite UPSERT tutorial (insert if not exist, update if exist)
  • What is the max size allowed for an SQLite database?
  • SQLite Error: Invalid Value for PRAGMA Configuration
  • SQLite Error: Failed to Load Extension Module
  • SQLite Error: Data Type Mismatch in INSERT Statement
  • SQLite Warning: Query Execution Took Longer Than Expected
  • SQLite Error: Cannot Execute VACUUM on Corrupted Database
  • SQLite Error: Missing Required Index for Query Execution
  • SQLite Error: FTS5 Extension Malfunction Detected
  • SQLite Error: R-Tree Node Size Exceeds Limit
  • SQLite Error: Session Extension: Invalid Changeset Detected
  • SQLite Error: Invalid Use of EXPLAIN Statement
  • SQLite Warning: Database Connection Not Closed Properly
  • SQLite Error: Cannot Attach a Database in Encrypted Mode
  • SQLite Error: Insufficient Privileges for Operation
  • SQLite Error: Cannot Bind Value to Parameter
  • SQLite Error: Maximum String or Blob Size Exceeded
  • SQLite Error: Circular Reference in Foreign Key Constraints