Conceptos básicos de tipos de datos
10 ejemplos para empezar con los tipos de datos de PostgreSQL: 7 básicos y 3 intermedios.
Busca en todas las páginas de la documentación
10 ejemplos para empezar con los tipos de datos de PostgreSQL: 7 básicos y 3 intermedios.
Conectado a PostgreSQL 18 con privilegio CREATE en un esquema temporal.
# Desarrollo local con Docker (PostgreSQL 18)
docker run -d --name pg18 -e POSTGRES_PASSWORD=dev -p 5432:5432 postgres:18
psql postgres://postgres:dev@localhost:5432/postgresbigint para IDs; int para recuentos; smallint para enums como enteros.
CREATE TABLE app.counts (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
score int NOT NULL CHECK (score BETWEEN 0 AND 100)
);bigint evita el desbordamiento de int en IDs de SnowflakeCHECK aplica el rango sin validación solo de la aplicacióntext no tiene penalización de rendimiento frente a varchar(n) en PostgreSQL.
CREATE TABLE app.labels (
code text NOT NULL UNIQUE,
title text NOT NULL
);varchar(n) cuando el estándar exija una longitud máximatext es el predeterminado para cadenas arbitrariasTres valores si es anulable; prefiere NOT NULL con un valor predeterminado.
ALTER TABLE app.customers ADD COLUMN is_active boolean NOT NULL DEFAULT true;NULL signifique desconocidois_active = truenumeric(p,s) para aritmética decimal exacta.
CREATE TABLE app.payments (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
amount numeric(12,2) NOT NULL CHECK (amount >= 0)
);float para monedaSUM y AVG se mantienen exactosAlmacena instantes en UTC.
CREATE TABLE app.events (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
occurred_at timestamptz NOT NULL DEFAULT now()
);Session TimeZone solo afecta la visualizacióntimestamp without time zone para eventos realesbtree en occurred_atTipo uuid con gen_random_uuid().
CREATE EXTENSION IF NOT EXISTS pgcrypto;
CREATE TABLE app.tokens (
id uuid PRIMARY KEY DEFAULT gen_random_uuid()
);uuidv7 en la capa de aplicación para el orden temporalJSON binario con operadores de indexación.
CREATE TABLE app.profiles (
user_id bigint PRIMARY KEY,
attrs jsonb NOT NULL DEFAULT '{}'::jsonb
);
INSERT INTO app.profiles VALUES (1, '{"tier":"pro"}');jsonb elimina claves duplicadas y las descomponeConjunto cerrado de etiquetas almacenado como OIDs.
CREATE TYPE app.plan_tier AS ENUM ('free','pro','enterprise');
ALTER TABLE app.customers ADD COLUMN tier app.plan_tier NOT NULL DEFAULT 'free';Arrays de Postgres para etiquetas (úsalo con cuidado).
ALTER TABLE app.customers ADD COLUMN tags text[] NOT NULL DEFAULT '{}';
CREATE INDEX customers_tags_gin ON app.customers USING gin (tags);@>Reglas CHECK reutilizables sobre un tipo base.
CREATE DOMAIN app.email AS text
CHECK (VALUE ~* '^[^@]+@[^@]+\.[^@]+$');
ALTER TABLE app.customers ALTER COLUMN email TYPE app.email USING email::app.email;NOT NULL y UNIQUEVersiones de la pila: Esta página se escribió para PostgreSQL 18.4 (estable 18, mantenimiento 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x y PostGIS 3.5+.
Revisado por Chris St. John·Última actualización: 16 jul 2026