Tipos de Dados e Restrições de Integridade em Bancos de Dados SQL

  1. Tipos de Dados Fundamentais

1.1 Tipos Inteiros

Os tipos inteiros variam de acordo com o espaço de armazenamento e o intervalo de valores suportado. O uso da restrição UNSIGNED permite dobrar o limite superior ao descnosiderar números negativos.

Tipo Bytes Bits Intervalo (Unsigned) Intervalo (Signed)
TINYINT 1 8 0 a 255 -128 a 127
SMALLINT 2 16 0 a 65535 -32768 a 32767
MEDIUMINT 3 24 0 a 16777215 -8388608 a 8388607
INT 4 32 0 a 4294967295 -2147483648 a 2147483647
BIGINT 8 64 0 a 18.446.744.073.709.551.615 -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807

Observações importantes:

  • O parâmetro de largura de exibição (ex: INT(11)) não altera a capacidade de armazenamento, apenas como o dado é formatado com ZEROFILL. Esta prática caiu em desuso a partir do MySQL 8.0.17.

1.2 Ponto Flutuante e Ponto Fixo

Para valores decimais, existem duas categorias: aproximados (FLOAT/DOUBLE) e exatos (DECIMAL).

  • FLOAT e DOUBLE: Utilizam aritmética de ponto flutuante, o que pode gerar pequenas imprecisões em cálculos complexos.
  • DECIMAL: Armazena números como strings internamente, garantindo precisão absoluta. É o padrão recomendado para aplicações financeiras.
-- Exemplo de comparação de precisão
CREATE TABLE controle_financeiro (
    valor_float FLOAT(20,10),
    valor_double DOUBLE(20,10),
    valor_preciso DECIMAL(20,10)
);

INSERT INTO controle_financeiro VALUES (12345.6789012345, 12345.6789012345, 12345.6789012345);

Ao consultar os dados, o FLOAT apresentará distorções após a 7ª casa decimal, o DOUBLE após a 15ª, enquanto o DECIMAL manterá o valor exato definido.

1.3 Tipos de Texto: CHAR e VARCHAR

A escolha entre CHAR e VARCHAR impacta o desempenho e o consumo de disco:

  • CHAR(n): Comprimento fixo. Se a string for menor que n, o banco preenche com espaços. É mais rápido para acessos diretos.
  • VARCHAR(n): Comprimento variável. Armazena apenas o conteúdo real mais um prefixo de tamanho. Economiza espaço em strings de tamanhos diversos.
-- Demonstração de comportamento
CREATE TABLE cadastros (
    sigla_estado CHAR(2),
    descricao_longa VARCHAR(255)
);

Para medir o tamanho real dos caracteres armazenados, utiliza-se a função CHAR_LENGTH(coluna). No caso do CHAR, o MySQL normalmente remove os espaços de preenchimento na leitura, a menos que o sql_mode inclua PAD_CHAR_TO_FULL_LENGTH.

1.4 Datas e Horários

Os tipos temporais permitem gerenciar cronologia de forma eficiente:

  • DATE: Apenas data (AAAA-MM-DD).
  • TIME: Apenas horário (HH:MM:SS).
  • DATETIME: Data e hora combinadas.
  • YEAR: Apenas o ano.
CREATE TABLE agendamentos (
    data_evento DATE,
    hora_inicio TIME,
    registro_completo DATETIME,
    ano_referencia YEAR
);

INSERT INTO agendamentos VALUES ('2023-12-25', '14:30:00', '2023-12-25 14:30:00', '2023');

1.5 ENUM e SET

São tipos de objetos de string que restringem as entradas a valores pré-definidos:

  • ENUM: Permite escolher exatamente um valor de uma lista.
  • SET: Permite escolher zero ou mais valores de uma lista.
CREATE TABLE perfil_usuario (
    nivel_acesso ENUM('admin', 'editor', 'leitor'),
    interesses SET('tecnologia', 'esportes', 'musica')
);

  1. Restrições (Constraints)

Restrições são regras aplicadas às colunas para garantir a validade e a integridade dos dados inseridos.

2.1 NOT NULL e UNIQUE

  • NOT NULL: Impede que o campo fique vazio (NULL).
  • UNIQUE: Garante que não existam dois registros com o mesmo valor na coluna, permitindo, porém, valores nulos (se não houver restrição NOT NULL).
CREATE TABLE inventario (
    item_id INT NOT NULL,
    codigo_barras VARCHAR(50) UNIQUE
);

2.2 Chave Primária (PRIMARY KEY)

A Chave Primária é o identificador exclusivo de uma linha. Por definição, ela é NOT NULL e UNIQUE simultaneamente. Além disso, o banco de dados cria um índice clusterizado para otimizar buscas por esta coluna.

-- Chave primária simples
CREATE TABLE clientes (
    cliente_id INT PRIMARY KEY,
    nome VARCHAR(100)
);

-- Chave primária composta
CREATE TABLE itens_pedido (
    pedido_id INT,
    produto_id INT,
    PRIMARY KEY (pedido_id, produto_id)
);

2.3 Incremento Automático (AUTO_INCREMENT)

Geralmente associado à Chave Primária, o AUTO_INCREMENT gera sequências numéricas automaticamente.

CREATE TABLE logs_sistema (
    log_id INT PRIMARY KEY AUTO_INCREMENT,
    mensagem TEXT
);

-- Ajustando o valor inicial do incremento
ALTER TABLE logs_sistema AUTO_INCREMENT = 1000;

Se registros forem excluídos, o contador do AUTO_INCREMENT não retrocede automaticamente, garantindo que identificadores antigos não sejam reutilizados imediatamente por novos dados.

Tags: MySQL SQL databases data-types backend

Publicado em 6-23 19:48