CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
email TEXT NOT NULL UNIQUE,
name TEXT NOT NULL,
age INTEGER CHECK (age IS NULL OR age >= 0),
status TEXT NOT NULL DEFAULT 'active'
CHECK (status IN ('active', 'archived', 'banned')),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL,
amount NUMERIC(10,2) NOT NULL CHECK (amount > 0),
currency CHAR(3) NOT NULL DEFAULT 'USD',
status TEXT NOT NULL DEFAULT 'pending',
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
CONSTRAINT fk_orders_user
FOREIGN KEY (user_id) REFERENCES users(id)
ON DELETE CASCADE, -- delete orders when user is deleted
-- Composite UNIQUE — at most one "primary" order per user
CONSTRAINT uq_user_primary UNIQUE (user_id, status)
DEFERRABLE INITIALLY DEFERRED
);
CREATE INDEX idx_orders_user_created ON orders (user_id, created_at DESC);
Create a free account and build your private vault. Share publicly whenever you want.