CodeGym /Cursos /SQL SELF /Usando DEFAULT para valores padrão

Usando DEFAULT para valores padrão

SQL SELF
Nível 17, Lição 2
Disponível

Às vezes a gente não quer preencher todos os campos na mão — bate aquela preguiça ou simplesmente não tem os dados ainda. Nessas horas, dá pra deixar valores padrão já definidos, aí o banco coloca eles sozinho quando precisar.

Inserindo linhas na tabela

Valores padrão têm tudo a ver com inserir linhas na tabela. Então vou explicar rapidinho isso agora, e daqui a pouco a gente volta nesse assunto com mais detalhes.

Adicionar linhas numa tabela é bem fácil — tem um comando especial pra isso: INSERT INTO. INSERT INTO é um comando SQL que adiciona novas linhas na tabela. Ele é um dos mais usados, principalmente quando você mexe com formulários web, logs, cadastro de usuários e atualização de dados.

Sintaxe do comando

INSERT INTO tabela (coluna1, coluna2, ...)
VALUES (valor1, valor2, ...);

Explicando:

  • tabela — nome da tabela onde os dados vão ser inseridos.
  • coluna1, coluna2, ... — lista das colunas (pode pular se você passar valores pra todas as colunas na ordem certa).
  • valor1, valor2, ... — valores que correspondem às colunas listadas.

Exemplo simples

INSERT INTO users (name, email)
VALUES ('Alice', 'alice@example.com');

Adiciona na tabela users uma linha: nome — "Alice", email — "alice@example.com".

Resultado:

id name email
1 Alice alice@example.com

Inserindo várias linhas de uma vez

Dá também pra inserir vários registros num só comando — é mais rápido e econômico.

INSERT INTO users (name, email)
VALUES 
  ('Alice', 'alice@example.com'),
  ('Bob', 'bob@example.net'),
  ('Charlie', 'charlie@example.org'),
  ('Diana', 'diana@example.com'),
  ('Eve', 'eve@example.net');

E olha como fica o resultado:

id name email
1 Alice alice@example.com
2 Bob bob@example.net
3 Charlie charlie@example.org
4 Diana diana@example.com
5 Eve eve@example.net

Valor padrão

Lembra da sintaxe do comando pra adicionar linhas?

INSERT INTO tabela (coluna1, coluna2, ...)
VALUES (valor1, valor2, ...);

Já pensou por que tem aquela lista de colunas: coluna1, coluna2? Não dava pra só passar os valores na mesma ordem das colunas da tabela?

O lance é que tem muito valor que você pode não passar na hora de inserir dados. Por exemplo, o ID de uma nova linha o PostgreSQL calcula sozinho quando insere. Ele também pode calcular a data/hora atual e colocar na coluna certa. Se algum dado não for passado, o PostgreSQL coloca NULL.

O PostgreSQL pode fazer muita coisa útil pra você. E você pode controlar isso — é pra isso que servem os valores padrão, definidos com a palavra-chave DEFAULT.

O valor padrão é usado quando você não passa um valor pra uma coluna na hora de inserir. Isso não só economiza tempo, mas também evita erros bobos, tipo esquecer de passar um valor importante.

Como funciona o DEFAULT?

Bora ver a sintaxe. Os valores padrão são definidos quando você cria a tabela. O formato geral é assim:

CREATE TABLE tabela (
    coluna tipo_de_dado DEFAULT valor_padrao
);

Ou, se você quiser adicionar um valor padrão numa tabela que já existe:

ALTER TABLE tabela
ALTER COLUMN coluna
SET DEFAULT valor_padrao;

Vou explicar mais sobre alterar tabelas em umas aulas pra frente :P

Exemplo 1: Tabela com campo DEFAULT

Vamos criar uma tabela students, onde cada estudante recebe automaticamente a data de registro:

CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    registration_date DATE DEFAULT CURRENT_DATE
);

Agora, quando você adiciona um novo estudante sem passar o registration_date, o PostgreSQL preenche esse campo com a data de hoje.

INSERT INTO students (name) VALUES ('Alex Lin');

Se você fizer a consulta:

SELECT * FROM students;

Vai ver esse resultado:

id name registration_date
1 Alex Lin 2023-10-15

Exemplos práticos

Valor padrão pra coluna numérica

Imagina que temos uma tabela grades, onde a coluna grade deve ter valor padrão 0 se a nota ainda não foi lançada.

CREATE TABLE grades (
    id SERIAL PRIMARY KEY,
    student_id INTEGER NOT NULL,
    course_id INTEGER NOT NULL,
    grade INTEGER DEFAULT 0
);

Vamos adicionar um registro sem passar o grade:

INSERT INTO grades (student_id, course_id) VALUES (1, 101);

Agora a tabela fica assim:

id student_id course_id grade
1 1 101 0

Usando TEXT com valor padrão

Pensa numa tabela teachers, onde cada professor recebe automaticamente o status "unverified" quando é cadastrado.

CREATE TABLE teachers (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    status TEXT DEFAULT 'unverified'
);

Vamos adicionar um professor sem passar o status:

INSERT INTO teachers (name) VALUES ('Peter Pall');

O resultado vai ser assim:

id name status
1 Peter Pall unverified

Valores padrão pra horário

Pra tabela meetings, que guarda dados de reuniões, dá pra definir o campo meeting_time com o horário padrão: 10:00 da manhã.

CREATE TABLE meetings (
    id SERIAL PRIMARY KEY,
    topic VARCHAR(100),
    meeting_time TIME DEFAULT '10:00'
);

Adicionando um registro:

INSERT INTO meetings (topic) VALUES ('Discussão do projeto');

Resultado:

id topic meeting_time
1 Discussão do projeto 10:00

Erros comuns ao usar DEFAULT

Tipo de dado do valor padrão não bate com a coluna. Se você tentar colocar um valor de texto numa coluna numérica, o PostgreSQL vai reclamar:

CREATE TABLE example (
    number INTEGER DEFAULT 'texto'
);

Erro: invalid input syntax for type integer.

Alterar DEFAULT sem pensar nos registros que já existem. Quando você muda o valor padrão, isso não afeta os registros que já estavam lá — eles continuam do jeito antigo. Se quiser atualizar as linhas antigas, use UPDATE.

UPDATE students SET registration_date = '2023-01-01' WHERE registration_date IS NULL;

Confundir DEFAULT com NOT NULL. Valor padrão não quer dizer que o campo é obrigatório (NOT NULL). Se você não colocar NOT NULL, a coluna pode aceitar NULL sim.

2
Tarefa
SQL SELF, nível 17, lição 2
Bloqueado
Criação de tabela usando `DEFAULT` para valor numérico
Criação de tabela usando `DEFAULT` para valor numérico
2
Tarefa
SQL SELF, nível 17, lição 2
Bloqueado
Uso de múltiplas colunas com valor `DEFAULT`
Uso de múltiplas colunas com valor `DEFAULT`
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION