SQLite DDL and Schema Design Cheatsheet

CREATE TABLE, constraints, generated columns, foreign keys, defaults, and schema design patterns for production SQLite databases.

View
StandardDetailedCompact
Export
Copy the compact sheet, download it, or print it.
Download
`D` dense toggle · `C` copy all
## Create tables and constraints
Create a basic table
CREATE TABLE users (
  id INTEGER PRIMARY KEY,
  email TEXT NOT NULL UNIQUE,
  display_name TEXT,
  created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
);

# Define a rowid-backed table with primary key and timestamps.

Use a CHECK constraint
CREATE TABLE subscriptions (
  id INTEGER PRIMARY KEY,
  plan TEXT NOT NULL CHECK (plan IN ('free','premium','team')),
  status TEXT NOT NULL CHECK (status IN ('active','canceled','past_due'))
);

# Validate allowed values at the database layer.

Add a foreign key
CREATE TABLE posts (
  id INTEGER PRIMARY KEY,
  user_id INTEGER NOT NULL,
  title TEXT NOT NULL,
  body TEXT NOT NULL,
  FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);

# Reference a parent table from a child table.

Create a WITHOUT ROWID table
CREATE TABLE locale_strings (
  locale TEXT NOT NULL,
  key TEXT NOT NULL,
  value TEXT NOT NULL,
  PRIMARY KEY (locale, key)
) WITHOUT ROWID;

# Optimize some composite-key tables.

Create a generated column
CREATE TABLE events (
  id INTEGER PRIMARY KEY,
  payload TEXT NOT NULL,
  event_type TEXT GENERATED ALWAYS AS (json_extract(payload, '$.type')) STORED
);

# Materialize or compute a derived value from another column.

## Change schemas safely
Add a column
ALTER TABLE users ADD COLUMN timezone TEXT;

# Append a new nullable or defaulted column.

Rename a table
ALTER TABLE users RENAME TO app_users;

# Change the table name without recreating data.

Rename a column
ALTER TABLE app_users RENAME COLUMN display_name TO full_name;

# Adjust a column name in-place.

Rebuild a table for complex changes
BEGIN;
CREATE TABLE users_new (
  id INTEGER PRIMARY KEY,
  email TEXT NOT NULL UNIQUE,
  full_name TEXT,
  timezone TEXT
);
INSERT INTO users_new (id, email, full_name, timezone)
SELECT id, email, display_name, timezone FROM users;
DROP TABLE users;
ALTER TABLE users_new RENAME TO users;
COMMIT;

# Canonical pattern for dropping constraints or changing types.

Recommended next

No recommendations yet.