Noções Básicas de Tipos de Dados
10 exemplos para você começar com os tipos de dados do PostgreSQL - 7 básicos e 3 intermediários.
Pré-requisitos
Conectado ao PostgreSQL 18 com privilégio CREATE em um esquema de rascunho.
# Desenvolvimento local com Docker (PostgreSQL 18)
docker run -d --name pg18 -e POSTGRES_PASSWORD=dev -p 5432:5432 postgres:18
psql postgres://postgres:dev@localhost:5432/postgresExemplos Básicos
1. Família de Inteiros
bigint para IDs; int para contagens; smallint para enums como inteiros.
CREATE TABLE app.counts (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
score int NOT NULL CHECK (score BETWEEN 0 AND 100)
);bigintevita overflow deintem IDs do SnowflakeCHECKimpõe o intervalo sem validação apenas no aplicativo- Tipos menores estreitam índices
2. text vs varchar
text não tem penalidade de desempenho em relação a varchar(n) no PostgreSQL.
CREATE TABLE app.labels (
code text NOT NULL UNIQUE,
title text NOT NULL
);- Use
varchar(n)quando o padrão exigir comprimento máximo texté o padrão para strings arbitrárias- A colação afeta a ordem de classificação
3. Booleano
Três valores se for anulável; prefira NOT NULL com padrão.
ALTER TABLE app.customers ADD COLUMN is_active boolean NOT NULL DEFAULT true;- Evite tri-estado booleano, a menos que
NULLsignifique desconhecido - Índices parciais geralmente filtram
is_active = true
4. numeric para Dinheiro
numeric(p,s) para aritmética decimal exata.
CREATE TABLE app.payments (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
amount numeric(12,2) NOT NULL CHECK (amount >= 0)
);- Nunca use
floatpara moeda - Escala fixa na definição do tipo
SUMeAVGpermanecem exatos
5. timestamptz
Armazene instantes em UTC.
CREATE TABLE app.events (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
occurred_at timestamptz NOT NULL DEFAULT now()
);Session TimeZoneafeta apenas a exibição- Evite
timestamp without time zonepara eventos reais - Consultas de intervalo se beneficiam de
btreeemoccurred_at
6. Chaves UUID
Tipo uuid com gen_random_uuid().
CREATE EXTENSION IF NOT EXISTS pgcrypto;
CREATE TABLE app.tokens (
id uuid PRIMARY KEY DEFAULT gen_random_uuid()
);- UUIDs aleatórios fragmentam ligeiramente os índices
- Considere
uuidv7na camada do aplicativo para ordem de tempo - Menor que strings
UUIDde texto
7. Documentos jsonb
JSON binário com operadores de indexação.
CREATE TABLE app.profiles (
user_id bigint PRIMARY KEY,
attrs jsonb NOT NULL DEFAULT '{}'::jsonb
);
INSERT INTO app.profiles VALUES (1, '{"tier":"pro"}');jsonbremove chaves duplicadas e decompõe- Índices GIN aceleram consultas de contenção
- Não espelhe todos os campos relacionais em JSON
Exemplos Intermediários
8. Tipo Enum
Conjunto fechado de rótulos armazenados 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';- Comparações rápidas e saída legível
- Adicionar valores requer disciplina de migração
- Tabelas de consulta são mais flexíveis para mudanças frequentes
9. Coluna de Array
Arrays do Postgres para tags (use com cuidado).
ALTER TABLE app.customers ADD COLUMN tags text[] NOT NULL DEFAULT '{}';
CREATE INDEX customers_tags_gin ON app.customers USING gin (tags);- GIN suporta contenção
@> - Evite crescimento ilimitado do array
- Normalize quando os elementos se tornarem entidades
10. Wrapper de Domínio
CHECK reutilizável em um tipo base.
CREATE DOMAIN app.email AS text
CHECK (VALUE ~* '^[^@]+@[^@]+\.[^@]+$');
ALTER TABLE app.customers ALTER COLUMN email TYPE app.email USING email::app.email;- Definição única para regras repetidas
- Erros referenciam o nome do domínio
- Funciona com
NOT NULLeUNIQUE
Versões da Pilha: Esta página foi escrita para PostgreSQL 18.4 (estável 18, manutenção 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x e PostGIS 3.5+.