Criação de tabelas e alteração de dados

Aprenda a criar suas próprias tabelas de banco de dados e a alterar seus dados com segurança. Escreva instruções CREATE TABLE com tipos de dados adequados, proteja os dados com NOT NULL, UNIQUE, CHECK, chaves primárias e chaves estrangeiras e adicione, altere e remova linhas com INSERT, UPDATE e DELETE. Pratique a seleção exata das linhas desejadas, agrupe alterações relacionadas em transações que você pode confirmar ou desfazer e altere ou remova tabelas com ALTER TABLE e DROP TABLE. Os exemplos usam SQL padrão executada no SQLite e no PostgreSQL, com diferenças no MySQL, SQL Server e Oracle indicadas quando relevantes.

BásicoAula 6 de 6 do curso Curso de Noções básicas de SQL

O que você vai aprender

  1. Escrever instruções CREATE TABLE que definem uma tabela e suas colunas e escolher para cada coluna um tipo de dados adequado aos valores que ela armazenará.
    • Escrever uma instrução CREATE TABLE
      Definir uma nova tabela com colunas nomeadas, verificar sua estrutura e evitar os erros de sintaxe mais comuns entre iniciantes.
    • Escolher um tipo de dados para cada coluna
      Escolher tipos inteiro, decimal exato, ponto flutuante, texto, data e verdadeiro/falso para os valores de uma coluna e compreender como a tipagem flexível do SQLite difere da de bancos de dados mais rigorosos.
  2. Usar restrições para que o próprio banco de dados rejeite valores ausentes, duplicados, fora do intervalo e sem correspondência e dar a cada linha uma chave confiável.
    • Exigir valores, definir valores padrão e impor limites com NOT NULL, DEFAULT, UNIQUE e CHECK
      Declarar regras de coluna e de tabela que mantêm valores presentes, distintos e dentro de um intervalo e prever quais inserções uma regra rejeitará.
    • Identificar linhas com chaves primárias e identificadores gerados
      Declarar chaves primárias de uma coluna e compostas, deixar o banco de dados numerar novas linhas e compreender o que os identificadores gerados garantem ou não em cada sistema.
    • Relacionar tabelas com chaves estrangeiras
      Declarar chaves estrangeiras que mantêm válidas as referências entre tabelas, escolher o que acontece quando uma linha referenciada é excluída e ativar a aplicação das restrições onde ela estiver desativada.
  3. Adicionar novas linhas com INSERT, uma por vez, várias de uma vez ou copiadas de uma consulta, e tratar chaves geradas e duplicatas.
    • Inserir linhas com VALUES
      Escrever instruções INSERT ... VALUES com uma lista de colunas e textos, números, datas e NULL escritos corretamente, e interpretar os erros que impedem uma inserção.
    • Inserir dados a partir de consultas, retornar novas chaves e tratar duplicatas
      Copiar linhas com INSERT ... SELECT, recuperar valores gerados com RETURNING e decidir o que acontece quando uma linha inserida entra em conflito com uma existente.
  4. Alterar valores com UPDATE e remover linhas com DELETE, garantindo que cada instrução afete exatamente as linhas pretendidas.
    • Alterar valores com UPDATE
      Escrever instruções UPDATE que definem uma ou mais colunas, calculam novos valores a partir dos antigos e respeitam as restrições da tabela.
    • Remover linhas com DELETE
      Remover linhas escolhidas com DELETE, distinguir DELETE, TRUNCATE e DROP TABLE e decidir quando é melhor marcar uma linha como excluída do que removê-la.
    • Selecionar exatamente as linhas que você pretende alterar ou remover
      Construir condições WHERE para alterações que correspondam às linhas pretendidas e a nenhuma outra, e verificar o resultado antes de mantê-lo.
  5. Usar transações para que um conjunto de alterações relacionadas seja mantido ou desfeito por inteiro e recuperar-se adequadamente quando uma instrução falhar.
    • Confirmar ou desfazer um conjunto de alterações
      Iniciar uma transação, manter suas alterações com COMMIT ou desfazê-las com ROLLBACK e compreender a confirmação automática.
    • Tratar erros, pontos de salvamento e alterações de estrutura em uma transação
      Responder corretamente quando uma instrução falhar dentro de uma transação, desfazer parte de uma transação com um ponto de salvamento e saber quais bancos de dados podem desfazer CREATE, ALTER e DROP.
  6. Alterar a estrutura de tabelas existentes sem perder suas linhas e remover tabelas com segurança quando não forem mais necessárias.
    • Adicionar, renomear e remover colunas com ALTER TABLE
      Usar ALTER TABLE para adicionar, renomear e remover colunas e alterar tipos e restrições, contornando as limitações do SQLite.
    • Remover tabelas com DROP TABLE
      Remover tabelas com DROP TABLE, respeitar as dependências entre tabelas e escolher entre remover a tabela, esvaziá-la e excluir linhas.

Guia de estudo de Criação de tabelas e alteração de dados

6 capítulos

1

Criar tabelas com tipos adequados para as colunas

Uma tabela precisa de uma estrutura clara antes de armazenar dados úteis. Comece pelas informações que uma linha registra, dê um nome a cada uma e escolha como o banco de dados as armazenará. Você criará uma tabela vazia, inspecionará o que foi realmente criado e distinguirá um número usado em cálculos de um texto que apenas parece numérico. SQLite e PostgreSQL compartilham grande parte da sintaxe, mas suas regras de tipos podem produzir resultados muito diferentes.

1.1 Escrever uma instrução CREATE TABLE

Uma definição de tabela descreve o que cada linha pode conter. Ela não adiciona nenhuma linha. Em uma loja virtual, cada produto precisa de campos separados para seu identificador, nome, preço e quantidade em estoque.

Construa a definição
CREATE TABLE products (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  price NUMERIC(8, 2) NOT NULL,
  in_stock INTEGER DEFAULT 0
);

Leia de fora para dentro. CREATE TABLE products dá nome à nova tabela. Os parênteses contêm suas definições de coluna. Cada linha fornece um nome de coluna, um tipo e as regras dessa coluna, se houver. Vírgulas separam as definições; a última não tem vírgula. O ponto e vírgula encerra a instrução. Depois que ela é executada com sucesso, SELECT * FROM products; retorna zero linhas.

Essa declaração de chave gera identificadores no SQLite. No PostgreSQL, use id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY para gerá-los. A declaração decimal também se comporta de modo diferente nesses sistemas; escolher armazenamento exato faz parte da escolha de um tipo.

Dê a cada informação sua própria coluna

Uma linha de cliente poderia conter id, first_name, last_name, email e signup_date. Reunir “Ana Ruiz, ana@example.com” em um único campo dificulta pesquisar ou verificar o nome e o e-mail separadamente. Nomeie os campos de acordo com seu conteúdo. Nomes curtos em minúsculas unidos por sublinhados, como unit_price, são fáceis de reutilizar.

Evite palavras-chave como nomes: orders funciona, enquanto order sem aspas entra em conflito com a palavra-chave ORDER da SQL. Um nome que contém espaços precisa de aspas duplas, como em "order date", sempre que você o usar. O PostgreSQL converte nomes sem aspas para minúsculas, portanto Products e products sem aspas se referem ao mesmo nome.

Aspas simples têm outra função: delimitam valores de texto como 'Desk lamp'. Aspas duplas identificam nomes. O PostgreSQL lê "Desk lamp" como nome de coluna, não como texto de produto.

Verifique o que foi criado

Uma vírgula final antes de ) causa um erro de sintaxe. Uma vírgula ausente também costuma causar erro, mas o SQLite pode ler várias palavras como um único nome de tipo. CREATE TABLE t (a INTEGER b TEXT); cria uma coluna chamada a, não duas. Inspecione a definição:

  • Terminal do SQLite: .schema products exibe a instrução de criação.
  • SQL do SQLite: PRAGMA table_info(products); lista colunas e tipos.
  • psql do PostgreSQL: \d products mostra colunas, tipos e restrições.

CREATE TABLE IF NOT EXISTS products (...) evita um erro quando o nome já existe. A instrução não compara nem atualiza a definição antiga. Uma tabela sem uma coluna necessária continua assim.

Crie uma cópia pontual
CREATE TABLE cheap_products AS
SELECT name, price FROM products WHERE price < 10;

Isso cria colunas e copia as linhas da consulta. Alterações posteriores nos produtos não atualizam a cópia. No SQLite e no PostgreSQL, a nova tabela não herda a chave primária nem as regras NOT NULL ou CHECK da origem.

CREATE, ALTER e DROP pertencem à linguagem de definição de dados, ou DDL: alteram a estrutura. INSERT, UPDATE e DELETE pertencem à linguagem de manipulação de dados, ou DML: alteram linhas. SELECT lê dados; os livros divergem sobre incluí-la na DML ou dar às consultas uma família própria.

Principais conclusões

  • Definições de coluna contêm nome, tipo e regras opcionais.
  • Use vírgulas entre as definições, sem vírgula final.
  • Aspas simples delimitam texto; aspas duplas delimitam identificadores.
  • Inspecione a estrutura resultante, inclusive após uma instrução IF NOT EXISTS.
  • CREATE TABLE AS copia os dados da consulta sem copiar as restrições da origem.

1.2 Escolher um tipo de dados para cada coluna

Escolha um tipo conforme a função que o valor deve cumprir. Uma quantidade deve permitir operações aritméticas. Um código postal deve preservar seus caracteres, incluindo zeros iniciais. Ambos podem conter dígitos, mas precisam de armazenamento diferente.

Escolha tipos numéricos e de texto
ValoresTipo útilMotivo
Contagens inteirasINTEGERContagens não têm parte fracionária.
Valores monetários exatos no PostgreSQLNUMERIC(p, s)A aritmética decimal preserva valores exatos.
Valores monetários exatos no SQLiteCentavos em INTEGERCentavos inteiros evitam o armazenamento em ponto flutuante.
MediçõesREAL ou DOUBLE PRECISIONValores aproximados são adequados para grandezas medidas.
Nomes e códigosTEXT ou VARCHAR(n)Caracteres e zeros iniciais são preservados.

No PostgreSQL, NUMERIC(8, 2) tem oito dígitos no total, dois após a vírgula decimal. Seu maior valor positivo é 999.999,99. Inserir 12,345 armazena 12,35; 1.234.567,00 excede o limite porque precisa de sete dígitos antes da vírgula. DECIMAL é outro nome para essa família de tipos.

O SQLite aceita NUMERIC(8, 2), mas não impõe essa precisão nem essa escala. Ele armazena 19,99 em ponto flutuante e mantém 12,345 sem arredondamento. Armazene 1999 centavos inteiros para um valor exato de 19,99. O ponto flutuante aproxima frações binárias: SELECT 0.1 + 0.2 = 0.3; no SQLite retorna 0. O PostgreSQL trata esses literais decimais sem conversão como valores numéricos exatos; converta-os para DOUBLE PRECISION para ver o resultado aproximado.

Números em texto são ordenados por caracteres: '100', '25', '9' aparecem nessa ordem. Quantidades numéricas precisam de colunas numéricas. O código postal dos EUA '02139' deve ser armazenado como texto; armazená-lo como inteiro faz perder o zero inicial.

O VARCHAR(20) do PostgreSQL rejeita texto com mais de 20 caracteres. Seu CHAR(n) preenche textos mais curtos com espaços até um comprimento fixo. TEXT não tem limite declarado de caracteres. O SQLite trata VARCHAR(n) e CHAR(n) como texto, sem impor o comprimento nem adicionar preenchimento.

Armazene datas e valores sim/não

O PostgreSQL tem DATE, TIME, TIMESTAMP e BOOLEAN. Ele rejeita uma DATE impossível, como '2026-02-30'. O SQLite não tem um tipo de armazenamento dedicado a datas. Use texto ISO como '2026-03-15', cuja ordem dos caracteres corresponde à ordem das datas. O texto no formato dos EUA ordena incorretamente datas de anos diferentes: '12/01/2025' é ordenado depois de '03/15/2026'.

Um registro de data e hora acrescenta uma hora, como em '2026-03-15 14:30:00'. O PostgreSQL usa TRUE e FALSE para booleanos; o SQLite armazena 1 e 0 e aceita essas palavras-chave. O MySQL trata BOOLEAN como um inteiro pequeno; o SQL Server usa BIT.

Saiba o que o sistema impõe

Tabelas comuns do SQLite usam afinidade de tipo, uma preferência de armazenamento. Uma coluna INTEGER converte '5' em 5, mas aceita 'abc' como texto. O PostgreSQL rejeita texto que não pode se tornar um inteiro. O SQLite 3.37.0 e posteriores oferecem suporte a tabelas STRICT, cujos tipos permitidos são INT, INTEGER, REAL, TEXT, BLOB e ANY.

Para pedidos, escolha um id inteiro, e-mail em texto, uma data DATE no PostgreSQL ou em texto ISO no SQLite, NUMERIC(10, 2) no PostgreSQL ou centavos inteiros no SQLite para o total e um indicador booleano ou 0/1 para o pagamento. NULL significa ausente ou desconhecido; não é um tipo nem é igual a zero ou texto vazio. Uma coluna o aceita, a menos que uma regra o proíba.

Principais conclusões

  • Escolha tipos conforme o uso: aritmética, texto, tempo ou sim/não.
  • A precisão de NUMERIC conta todos os dígitos; a escala conta as casas decimais.
  • Use NUMERIC no PostgreSQL ou centavos inteiros no SQLite para valores monetários exatos.
  • Datas em texto ISO são ordenadas por data quando escritas de forma consistente.
  • A afinidade do SQLite permite armazenamento misto; STRICT reforça as verificações de tipo.
  • NULL marca um valor ausente ou desconhecido.
2

Proteger os dados com restrições

Um banco de dados pode verificar regras no momento em que os dados mudam, independentemente do programa que envia a alteração. Regras de coluna controlam valores ausentes, duplicatas e intervalos; chaves identificam linhas e mantêm válidos os vínculos entre tabelas. Você acompanhará inserções aceitas e rejeitadas, escolherá identificadores gerados e preverá o que acontece com pedidos quando um cliente é removido. Essas regras funcionam em conjunto: uma verificação de preço cumpre uma função diferente da exigência de que o preço esteja presente.

2.1 Exigir valores, definir valores padrão e impor limites com NOT NULL, DEFAULT, UNIQUE e CHECK

Uma restrição faz o banco de dados rejeitar dados que violam uma regra declarada. A verificação ocorre quando linhas são inseridas ou atualizadas, independentemente da aplicação que envia a instrução. Regras diferentes protegem partes diferentes de um registro de produto.

Combine regras em uma tabela

Esta definição no SQLite gera a chave e verifica os demais campos. Para o PostgreSQL, substitua a linha da chave por uma chave primária de identidade.

CREATE TABLE products (
  id INTEGER PRIMARY KEY,
  sku TEXT NOT NULL UNIQUE,
  name TEXT NOT NULL,
  price NUMERIC(8, 2) NOT NULL CHECK (price > 0),
  in_stock INTEGER NOT NULL DEFAULT 0 CHECK (in_stock >= 0)
);

NOT NULL exige um valor. UNIQUE impede a repetição de um SKU. CHECK (price > 0) rejeita preços zero ou negativos. A quantidade em estoque tem valor padrão 0 e deve permanecer não negativa. A declaração numérica do SQLite não fornece aritmética decimal exata, portanto use centavos inteiros quando a exatidão for necessária.

Distinga omissão de NULL

Insira uma luminária de mesa com SKU 'LAMP-01', nome 'Desk lamp' e preço 24,99, omitindo o estoque da lista de colunas. A inserção é bem-sucedida e recebe estoque 0. Informar NULL para o estoque não solicita o valor padrão: a inserção falha na restrição NOT NULL.

Uma caneca de café com preço -3,50 falha na verificação de preço. Um segundo produto com SKU 'LAMP-01' falha em UNIQUE, mesmo que seu nome e preço sejam diferentes. Uma caneta sem nome falha em NOT NULL. Leia a regra ou coluna indicada no erro e corrija a entrada.

Texto vazio é um valor real. name TEXT NOT NULL aceita '' no SQLite e no PostgreSQL. Adicione CHECK (name <> '') para rejeitá-lo. O Oracle trata texto vazio como NULL, portanto a mesma entrada está sujeita a uma regra diferente nesse sistema.

Verifique combinações e valores ausentes

Uma regra de coluna vem após seu tipo. Uma regra de tabela é um item separado dentro da definição da tabela e pode comparar colunas:

CHECK (end_date >= start_date),
UNIQUE (order_id, product_id)

A primeira rejeita uma data final anterior à data inicial. A segunda rejeita um par repetido: um produto pode ocorrer em pedidos diferentes, mas não pode aparecer duas vezes no mesmo pedido. Uma tabela pode ter várias restrições de unicidade.

Uma verificação rejeita uma linha quando sua condição é falsa. Se o preço for NULL, price > 0 é desconhecido, portanto a linha passa pela verificação. Por isso, o preço do produto também precisa de NOT NULL. PostgreSQL, SQLite e MySQL normalmente permitem vários valores NULL sob UNIQUE; o SQL Server permite um em uma restrição de unicidade de uma coluna. O PostgreSQL 15 e posteriores oferecem UNIQUE NULLS NOT DISTINCT quando valores ausentes também devem entrar em conflito. Versões do MySQL anteriores à 8.0.16 ignoravam regras CHECK.

Dê à regra um nome útil com CONSTRAINT price_positive CHECK (price > 0). O nome ajuda a identificá-la em um erro e a removê-la depois. Uma restrição verifica exatamente sua expressão: CHECK (email LIKE '%@%') detecta a ausência de arroba, mas não detecta um erro de digitação em um endereço que, de resto, corresponde ao padrão.

Principais conclusões

  • NOT NULL rejeita valores ausentes, mas não rejeita texto vazio no SQLite ou no PostgreSQL.
  • DEFAULT preenche colunas omitidas; um NULL explícito não solicita o valor padrão.
  • UNIQUE pode proteger uma coluna ou uma combinação de colunas.
  • CHECK rejeita condições falsas; adicione NOT NULL quando valores desconhecidos também precisarem ser rejeitados.
  • Erros de restrição identificam dados que precisam de correção.

2.2 Identificar linhas com chaves primárias e identificadores gerados

Uma chave primária identifica uma linha de forma confiável. Ela pode ser uma coluna ou uma combinação, mas uma tabela tem no máximo uma chave primária. A chave deve ser única e estar presente, para que outras instruções possam identificar uma linha sem depender de sua descrição.

Escolha um identificador estável

Uma chave natural é um identificador existente no mundo real, como o ISBN de um livro. Uma chave substituta é um identificador artificial, muitas vezes um inteiro gerado. O e-mail de um cliente pode mudar; um identificador de cliente gerado pode permanecer o mesmo quando isso acontece.

Uma chave composta identifica uma combinação:

PRIMARY KEY (order_id, product_id)

Um pedido pode conter vários produtos, e um produto pode ocorrer em vários pedidos. O par identifica um item do pedido. Nenhuma das colunas precisa ser única por si só.

PostgreSQL, MySQL e SQL Server exigem que chaves primárias não estejam ausentes. Tabelas comuns do SQLite mantêm uma exceção histórica: uma chave primária diferente de INTEGER PRIMARY KEY pode conter NULL. Use code TEXT PRIMARY KEY NOT NULL para uma chave de texto. As tabelas STRICT do SQLite também eliminam essa possibilidade.

Deixe o banco de dados gerar o número
Banco de dadosDeclaração de chave primária gerada
SQLiteid INTEGER PRIMARY KEY
PostgreSQLid INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY
MySQLid INT AUTO_INCREMENT PRIMARY KEY
SQL Serverid INT IDENTITY(1, 1) PRIMARY KEY

Omita id da lista de colunas da inserção para solicitar um valor gerado. No PostgreSQL, INTEGER PRIMARY KEY sozinho não o gera. Código mais antigo do PostgreSQL costuma usar SERIAL.

No SQLite, INTEGER PRIMARY KEY é um apelido para o número interno da linha. Comece com os identificadores gerados 1, 2 e 3 e exclua o 3. O próximo identificador gerado normalmente é 3 novamente, um acima do máximo atual. Com INTEGER PRIMARY KEY AUTOINCREMENT, é 4: um número pertencente a uma linha confirmada não é reutilizado. Um número de uma inserção desfeita ainda pode ser reutilizado. Essa garantia mais forte exige trabalho adicional, portanto escolha-a quando o requisito de não reutilização for relevante.

Leia identificadores sem tratá-los como contagens

Lacunas são normais. Exclusões as deixam, e o PostgreSQL não devolve números de sequência após inserções que falharam ou foram desfeitas. Use COUNT(*) para contar linhas e um registro de data e hora para a hora de um evento. O maior identificador não responde de forma confiável a nenhuma das duas perguntas.

A forma GENERATED ALWAYS do PostgreSQL normalmente rejeita um identificador explícito como 50. GENERATED BY DEFAULT e SERIAL aceitam valores explícitos, mas fornecer 50 não faz o gerador avançar além de 50. Um valor gerado posteriormente pode entrar em conflito com ele.

Para usar a chave de uma nova linha em uma linha relacionada, recupere-a:

INSERT INTO customers (first_name, last_name, email)
VALUES ('Dev', 'Patel', 'dev@example.com')
RETURNING id;

RETURNING funciona no PostgreSQL e no SQLite 3.35.0 e posteriores. O SQLite também oferece last_insert_rowid(), o MySQL oferece LAST_INSERT_ID() e o SQL Server usa OUTPUT. Leia o resultado da inserção em vez de adivinhar o próximo identificador.

Principais conclusões

  • Uma chave primária identifica uma linha; uma chave composta identifica uma combinação.
  • Chaves geradas usam declarações diferentes em bancos de dados diferentes.
  • AUTOINCREMENT no SQLite impede a reutilização de identificadores confirmados, com custo adicional.
  • Lacunas em identificadores são normais; use COUNT(*) para contar linhas.
  • RETURNING recupera a chave realmente gerada.

2.3 Relacionar tabelas com chaves estrangeiras

O customer_id de um pedido deve apontar para um cliente existente. Uma chave estrangeira faz o banco de dados verificar esse vínculo. A tabela que contém a referência é a filha; a tabela para a qual ela aponta é a pai.

Declare e aplique o vínculo
CREATE TABLE orders (
  id INTEGER PRIMARY KEY,
  customer_id INTEGER NOT NULL REFERENCES customers(id)
);

Aqui, customers deve existir primeiro, e seu id deve ser uma chave primária ou única. Use tipos correspondentes nos dois lados. A forma de tabela, FOREIGN KEY (customer_id) REFERENCES customers(id), declara o mesmo vínculo separadamente da coluna.

Com a aplicação das restrições ativada, um pedido para o cliente 99 falha quando não existe um cliente 99. Atualizar um pedido para esse cliente inexistente também falha. Uma chave estrangeira que aceita valores ausentes pode conter NULL, significando que não há linha vinculada; NOT NULL torna o vínculo obrigatório.

No SQLite, execute PRAGMA foreign_keys = ON; em cada nova conexão antes de iniciar uma transação. Alterar essa configuração dentro de uma transação não tem efeito. PostgreSQL e SQL Server aplicam normalmente as restrições de chave estrangeira, assim como o mecanismo padrão InnoDB do MySQL.

Preveja a exclusão de uma linha pai

Use os clientes 1, Ana, e 2, Ben. Os pedidos 101 e 102 pertencem a Ana; 103 pertence a Ben. Considere a exclusão do cliente 1 sob diferentes declarações:

Ação ON DELETEResultado
NO ACTION ou RESTRICTA exclusão falha enquanto 101 e 102 fizerem referência a Ana.
CASCADEAna, 101 e 102 são removidos; Ben e 103 permanecem.
SET NULLAna é removida; todos os pedidos permanecem, com 101 e 102 desvinculados.
SET DEFAULTOs valores de referência recebem seu valor padrão declarado.

SET NULL exige uma coluna que aceite valores ausentes. SET DEFAULT ainda precisa satisfazer a chave estrangeira: um valor padrão não ausente deve identificar uma linha pai existente. Um valor padrão NULL funciona quando vínculos ausentes são permitidos.

Escolha de acordo com o significado dos dados. Itens de pedido frequentemente pertencem inteiramente ao pedido, portanto a propagação em cascata pode ser adequada. Pedidos que precisam ser mantidos exigem uma ação de bloqueio quando alguém tenta remover seu cliente. Um vínculo opcional com fornecedor pode receber NULL. Aplicar ações em cascata em toda parte permite que uma exclusão remova mais registros do que o nome de sua tabela sugere.

Trabalhe na ordem das dependências

Crie as tabelas pai antes das filhas e insira linhas pai antes das linhas que fazem referência a elas. Ao remover dados ou tabelas relacionados, trabalhe das tabelas filhas para as pai. Uma ação ON UPDATE oferece as mesmas opções quando a chave da tabela pai muda; ON UPDATE CASCADE copia a nova chave para as linhas filhas.

RESTRICT verifica imediatamente. NO ACTION, o padrão, pode esperar até o fim da instrução ou até o fim da transação no caso de uma restrição adiável. Ambos bloqueiam uma exclusão comum que deixaria referências sem correspondência. Mantenha identificadores gerados estáveis para que alterar os dados de um cliente não exija alterar todas as referências a ele.

Principais conclusões

  • Uma chave estrangeira vincula valores da tabela filha a uma chave primária ou única existente na tabela pai.
  • NULL permite um vínculo opcional, a menos que NOT NULL o proíba.
  • CASCADE exclui linhas filhas; SET NULL as mantém sem o vínculo.
  • Ative as chaves estrangeiras do SQLite antes de BEGIN em cada conexão.
  • Crie e insira primeiro as tabelas e linhas pai; exclua e remova primeiro as filhas.
  • Escolha as ações de acordo com os registros que precisam ser mantidos.
3

Adicionar linhas com INSERT

Adicionar linhas significa associar cada valor à coluna correta e deixar o banco de dados verificar o resultado. Um produto pode ser inserido diretamente, vários clientes podem ser adicionados juntos e pedidos antigos podem ser copiados de uma consulta. Você também recuperará uma chave gerada e escolherá como tratar um SKU existente. A mesma entrada pode significar uma quantidade de estoque substituta ou uma entrega adicional, portanto uma inserção ou atualização deve expressar a alteração pretendida com precisão.

3.1 Inserir linhas com VALUES

INSERT adiciona linhas a uma tabela existente. Sua lista de colunas é o mapa entre os valores que você fornece e os campos que os recebem. Escreva o mapa explicitamente para que uma alteração posterior na tabela não mude silenciosamente o significado da entrada.

Associe valores pela posição
INSERT INTO products (sku, name, price, in_stock)
VALUES ('LAMP-01', 'Desk lamp', 24.99, 12);

Leia os pares em ordem: SKU recebe 'LAMP-01', nome recebe 'Desk lamp', preço recebe 24,99 e estoque recebe 12. Deve haver quatro valores para essas quatro colunas. Uma divergência, como dois valores para três colunas, causa uma falha.

Sem a lista, os valores seguem a ordem declarada das colunas da tabela. O SQLite exige que todas as colunas recebam valores; o PostgreSQL permite menos valores e atribui valores padrão às colunas finais. Uma lista explícita evita depender de qualquer um desses comportamentos. Ela também permite colocar as colunas em uma ordem clara para a entrada.

Um par trocado pode ser pior que um erro de sintaxe. Fornecer 9,99 como nome e 'Desk lamp' como preço faz o PostgreSQL rejeitar o preço não numérico. A afinidade de tipo comum do SQLite pode armazenar o texto “9.99” como nome e o texto “Desk lamp” como preço sem erro. Leia a linha inserida com SELECT para verificar a associação.

Escreva valores literais corretamente
TipoExemplo SQL
Texto'Desk lamp'
Texto com apóstrofo'O''Brien'
Número1250.50
Data ISO'2026-03-15'
Valor ausenteNULL

O apóstrofo duplicado armazena um apóstrofo. Números não têm símbolo de moeda nem separador de milhares; uma vírgula separa valores, portanto uma vírgula dentro de um valor sem aspas altera a quantidade de valores. 'NULL' é o texto de quatro letras “NULL”, não um valor ausente.

Deixe os campos omitidos serem preenchidos

Uma coluna omitida recebe seu valor padrão ou NULL se não tiver um. Uma chave gerada recebe um valor gerado. Esse último comportamento depende da declaração: INTEGER PRIMARY KEY do SQLite gera identificadores; o PostgreSQL exige uma declaração de identidade para isso. Uma chave primária inteira simples no PostgreSQL, quando omitida em uma inserção, causa uma falha porque seu valor seria NULL.

PostgreSQL, MySQL e SQL Server permitem DEFAULT como marcador de valor. O SQLite não o aceita dentro de uma lista VALUES; nesse caso, omita a coluna. Um NULL explícito nunca solicita o valor padrão.

Adicione várias linhas juntas
INSERT INTO customers (first_name, last_name, email) VALUES
  ('Ana', 'Ruiz', 'ana@example.com'),
  ('Ben', 'Okafor', 'ben@example.com'),
  ('Chloe', 'Nguyen', 'chloe@example.com');

Em uma tabela vazia cuja chave gerada começa em 1, elas recebem os identificadores 1, 2 e 3. Sob o tratamento comum de restrições, a instrução de várias linhas é bem-sucedida ou falha por inteiro. Se uma linha violar uma regra, nenhuma das linhas dessa instrução será inserida.

Um erro UNIQUE indica uma chave ou valor duplicado; NOT NULL indica dados ausentes; CHECK indica uma condição que falhou; e um erro de chave estrangeira indica um vínculo inválido. Corrija o valor ou sua associação pretendida antes de tentar novamente.

Principais conclusões

  • Liste as colunas e associe cada valor a elas pela posição.
  • Campos omitidos recebem valores padrão ou NULL; identificadores gerados exigem um gerador.
  • Use aspas simples para texto e duplique um apóstrofo dentro dele.
  • NULL e o texto NULL são diferentes.
  • Uma inserção comum de várias linhas falha por inteiro se uma linha violar uma restrição.

3.2 Inserir dados a partir de consultas, retornar novas chaves e tratar duplicatas

As linhas não precisam ser digitadas uma por vez. Uma consulta pode fornecer as linhas para uma inserção, e uma regra de conflito pode determinar o que acontece quando um valor único já existe. Ambos os recursos dependem da correspondência precisa com os dados pretendidos.

Copie o resultado de uma consulta
INSERT INTO archived_orders (id, customer_id, order_date, total)
SELECT id, customer_id, order_date, total
FROM orders
WHERE order_date < '2026-01-01';

Não há cláusula VALUES: a consulta fornece os valores. Associe as colunas selecionadas à lista de destino pela posição. A tabela de destino já deve existir, e suas regras continuam valendo.

Visualize o SELECT separadamente. Os pedidos 201, 202 e 204 têm as datas 2025-11-03, 2025-12-19 e 2025-10-30 e os totais 45,00, 120,50 e 60,00. Os pedidos 203 e 205 têm datas em 2026. A consulta retorna três linhas que totalizam 225,50, e a inserção copia essas três. Ela também pode copiar zero linhas quando o filtro não encontra nada.

Uma segunda execução tenta copiá-las novamente. Uma chave primária no destino faz a operação falhar em vez de armazenar duplicatas silenciosamente. INSERT ... SELECT é uma operação de cópia; não remove as linhas de origem nem mantém as duas tabelas sincronizadas.

Importações de arquivos frequentemente passam primeiro por uma tabela de preparação. O terminal do SQLite usa .import --csv file.csv staging; o psql usa \copy. Em uma consulta posterior, TRIM(email) remove espaços nas extremidades e NULLIF(TRIM(email), '') transforma um e-mail vazio ou composto de espaços em NULL. As restrições de destino verificam então as linhas limpas.

Leia o resultado de uma gravação
INSERT INTO customers (first_name, last_name, email)
VALUES ('Dev', 'Patel', 'dev@example.com')
RETURNING id;

O resultado fornece o identificador gerado do cliente para uso em uma linha relacionada. PostgreSQL e SQLite 3.35.0 e posteriores oferecem suporte a RETURNING em inserções, atualizações e exclusões. O MySQL usa LAST_INSERT_ID() para um identificador gerado; o SQL Server usa OUTPUT.

Decida como tratar duplicatas

Com stock (sku TEXT PRIMARY KEY, qty INTEGER NOT NULL), suponha que 'LAMP-01' tenha quantidade 12. Uma inserção simples que propõe o mesmo SKU e quantidade 20 falha. No SQLite e no PostgreSQL:

INSERT INTO stock (sku, qty) VALUES ('LAMP-01', 20)
ON CONFLICT (sku) DO UPDATE
SET qty = stock.qty + excluded.qty;

stock.qty é o valor existente 12. excluded.qty é o valor proposto 20. Essa forma armazena 32, adequada para uma entrega adicional. SET qty = excluded.qty armazena 20, adequado para uma contagem substituta. DO NOTHING mantém 12 e ignora a linha conflitante. Cada variação parte da mesma quantidade original 12.

Uma inserção ou atualização combina a inserção de uma nova linha com a atualização em caso de conflito. O alvo do conflito deve ter uma proteção de unicidade adequada. A família equivalente do MySQL é ON DUPLICATE KEY UPDATE. Um INSERT simples não corrige um cliente existente: cria outra linha ou encontra um erro de unicidade. Use UPDATE para uma linha que você sabe que existe e uma inserção ou atualização quando a linha já puder existir.

Principais conclusões

  • INSERT ... SELECT copia os resultados da consulta para uma tabela existente.
  • Executar novamente uma cópia exige uma política deliberada para duplicatas.
  • RETURNING informa valores das linhas efetivamente gravadas.
  • excluded identifica a linha proposta em uma inserção ou atualização.
  • Substitua o estoque com excluded.qty; some uma entrega com stock.qty + excluded.qty.
  • DO NOTHING ignora um conflito de unicidade sem atualizar a linha existente.
4

Alterar e remover linhas com UPDATE e DELETE

Uma instrução válida de alteração de dados ainda pode afetar as linhas erradas. Atualizar um preço, remover um pedido e selecionar os registros a alterar são decisões separadas. Você calculará novos valores a partir dos armazenados, distinguirá apagar um campo de excluir uma linha e construirá condições com datas, valores ausentes e alternativas agrupadas. Uma visualização prévia e a verificação do resultado tornam o efeito visível antes que uma transação torne a alteração permanente.

4.1 Alterar valores com UPDATE

UPDATE altera valores em linhas que já existem. Ele nomeia uma tabela, atribui novos valores com SET e depois escolhe as linhas-alvo com WHERE. As restrições da tabela verificam os valores resultantes.

Defina um ou vários campos
UPDATE products
SET price = 22.50, in_stock = 30
WHERE id = 3;

O produto com chave 3 recebe ambos os valores; as outras linhas mantêm os seus. As atribuições usam vírgulas. Escrever SET price = 22.50 AND in_stock = 30 não significa duas atribuições. O PostgreSQL rejeita a instrução; o SQLite trata o lado direito como uma expressão booleana e pode armazenar 0 ou 1 no preço.

A ausência de WHERE é válida em SQL e aplica a instrução a todas as linhas. UPDATE products SET price = 0; define o preço de todos os produtos como zero se as regras da tabela permitirem. Uma visualização prévia com a condição pretendida mostra se o alvo é uma linha, várias linhas ou nenhuma.

Calcule a partir do valor armazenado
UPDATE products
SET price = price * 1.10;

Um preço de 20,00 passa a 22,00 após um aumento de 10%. Um preço de 19,99 produz um resultado não arredondado de 21,989. O PostgreSQL armazena 21,99 em uma coluna NUMERIC(8, 2). O SQLite não impõe a escala, portanto SET price = ROUND(price * 1.10, 2) solicita duas casas decimais. Para armazenar dinheiro exatamente no SQLite, mantenha centavos inteiros e decida explicitamente como arredondá-los.

A expressão deve incluir o valor antigo quando a alteração é relativa. SET in_stock = in_stock - 1 remove uma unidade; SET in_stock = 1 substitui a contagem por um.

No SQLite e no PostgreSQL, todas as expressões à direita leem a linha antes da atualização. UPDATE t SET a = b, b = a; troca os valores de uma linha de 1 e 2 para 2 e 1. Uma atualização de tabela única no MySQL avalia as atribuições da esquerda para a direita, portanto a mesma forma define ambos como 2. Não transfira essa suposição entre sistemas.

Considere as regras e os valores ausentes

Use SET phone = NULL para apagar um campo de telefone. Para encontrar valores de telefone ausentes, use WHERE phone IS NULL. Uma igualdade com NULL não os encontra.

Considere os preços 12,00, 3,00 e 8,50 protegidos por CHECK (price > 0). Subtrair 5 de cada preço tornaria o segundo -2,00. No tratamento comum de restrições, essa falha desfaz toda a instrução, portanto até os preços que seriam válidos permanecem inalterados.

Uma atualização de chave primária também precisa satisfazer as chaves estrangeiras relacionadas. Uma alteração de chave bloqueada falha enquanto linhas filhas apontam para a chave antiga; ON UPDATE CASCADE transfere o novo valor para elas. Manter identificadores gerados estáveis evita esse trabalho adicional quando detalhes descritivos mudam.

Interprete a quantidade de linhas afetadas

O psql informa um resultado como UPDATE 3; a função changes() do SQLite informa a contagem da última instrução de alteração. Ambos incluem linhas correspondentes e atualizadas mesmo quando o valor atribuído é igual ao antigo. Uma contagem de três não garante três valores visivelmente diferentes. Compare a contagem com a visualização prévia e inspecione os campos relevantes depois, ou use RETURNING para ver diretamente as linhas afetadas.

Principais conclusões

  • SET atribui valores; WHERE escolhe linhas.
  • Separe atribuições com vírgulas, não com AND.
  • Use o valor antigo da coluna em um cálculo relativo.
  • Uma falha comum de restrição desfaz toda a instrução UPDATE.
  • Contagens de linhas afetadas podem incluir linhas cujos valores permaneceram iguais.

4.2 Remover linhas com DELETE

DELETE remove linhas inteiras. Ele deixa a tabela pronta para armazenar linhas novamente. Para apagar um campo, use UPDATE ... SET column = NULL; DELETE email FROM customers não é SQL válida.

Acompanhe uma exclusão filtrada

A loja tem estes pedidos:

IDStatusData do pedido
201cancelado2025-11-03
202enviado2025-12-19
203cancelado2026-01-08
204cancelado2025-10-30
205expirado2026-02-14
DELETE FROM orders
WHERE status = 'cancelled'
  AND order_date < '2026-01-01';

O pedido 201 atende aos dois testes, assim como o 204. O pedido 203 está cancelado, mas é recente demais; o 202 é antigo o suficiente, mas foi enviado. A instrução remove duas linhas e mantém 202, 203 e 205. DELETE FROM orders; sem a condição removeria todas as cinco.

Use dados relacionados para escolher linhas
DELETE FROM order_items
WHERE order_id IN (
  SELECT id FROM orders WHERE status = 'cancelled'
);

A consulta interna produz os identificadores dos pedidos cancelados. IN verifica o order_id de cada item em relação a essa lista. Execute a consulta interna separadamente para inspecionar as chaves e depois visualize as linhas de itens com a mesma condição.

As chaves estrangeiras também afetam a exclusão. Uma linha pai com linhas filhas que fazem referência a ela pode ser protegida por NO ACTION ou RESTRICT; uma ação em cascata remove as filhas; SET NULL mantém as filhas, mas apaga o vínculo. Verifique essas ações ao avaliar o efeito da exclusão de uma linha pai, pois a tabela indicada diretamente pode não ser a única alterada.

Escolha o que deve permanecer
InstruçãoLinhas removidasO que permanece
DELETE ... WHERE ...Linhas correspondentesTabela e outras linhas
DELETE FROM orders;Todas as linhasTabela vazia
TRUNCATE TABLE orders;Todas as linhas, sem WHERETabela vazia
DROP TABLE orders;Todas as linhas com a tabelaNenhuma tabela de pedidos

PostgreSQL, MySQL, SQL Server e Oracle oferecem suporte a TRUNCATE; o SQLite não. Suas regras de transação e dependência variam conforme o banco de dados. Uma instrução que parece ser uma operação rápida para esvaziar uma tabela ainda precisa respeitar essas regras.

Mantenha o histórico com uma exclusão lógica
UPDATE customers
SET deleted_at = '2026-03-15'
WHERE id = 7;

Uma exclusão lógica marca a linha sem removê-la. Ela pode preservar o histórico e permitir a restauração ao apagar a marca. Consultas de clientes ativos devem incluir WHERE deleted_at IS NULL; caso contrário, os clientes marcados ainda aparecem. Marcar dados não os apaga.

Uma exclusão confirmada não pode ser desfeita por um ROLLBACK posterior. A restauração exige uma cópia salva ou um backup. Dentro de uma transação aberta, o rollback ainda pode restaurar linhas excluídas. Verifique os identificadores selecionados e a contagem de linhas afetadas antes de tornar o resultado permanente.

Principais conclusões

  • DELETE remove linhas; UPDATE pode apagar um único campo.
  • A ausência de WHERE esvazia a tabela, mantendo sua estrutura.
  • IN pode selecionar linhas usando chaves de outra tabela.
  • Ações de chave estrangeira podem ampliar ou bloquear uma exclusão.
  • Uma exclusão lógica exige filtros para linhas ativas e não apaga os dados armazenados.
  • ROLLBACK restaura uma exclusão apenas enquanto sua transação permanece não confirmada.

4.3 Selecionar exatamente as linhas que você pretende alterar ou remover

Escolher linhas costuma ser a parte mais difícil de uma alteração. O mesmo filtro que é inofensivo em uma consulta pode excluir ou atualizar dados demais quando reutilizado em uma gravação. Transforme a regra pretendida em uma condição e depois inspecione o que ela realmente encontra.

Visualize a condição exata
SELECT id, status, order_date FROM orders
WHERE status = 'cancelled'
  AND order_date < '2026-01-01';

Essa visualização retorna os pedidos 201 e 204 no exemplo da loja com cinco pedidos. Reutilize exatamente essa condição na exclusão. Reescrevê-la ao mudar o comando cria uma nova seleção que não foi verificada.

Para uma linha específica, use sua chave primária: WHERE id = 42 corresponde a no máximo uma linha. Um nome descritivo como 'Desk lamp' pode ser compartilhado por vários produtos.

Agrupe alternativas explicitamente

AND tem precedência sobre OR. Compare:

WHERE status = 'cancelled'
   OR status = 'expired' AND order_date < '2026-01-01'

com:

WHERE (status = 'cancelled' OR status = 'expired')
  AND order_date < '2026-01-01'

A primeira aceita todos os pedidos cancelados, independentemente da data, além dos pedidos expirados antes de 2026. Ela corresponde a 201, 203 e 204. A segunda aplica o teste de data aos dois status e corresponde a 201 e 204. O pedido 203 revela a diferença porque foi cancelado em 2026.

Inclua valores ausentes deliberadamente

WHERE customer_id = NULL não corresponde a nenhuma linha. Valores ausentes exigem IS NULL ou IS NOT NULL. Um teste negativo também tem uma lacuna: status <> 'shipped' não inclui um status ausente, porque sua comparação é desconhecida.

Se um status ausente fizer parte do grupo pretendido, escreva:

WHERE status <> 'shipped' OR status IS NULL

Ao adicionar outra condição, agrupe toda essa alternativa entre parênteses para que ambos os ramos atendam a essa condição.

A busca por padrões pode alcançar valores além da descrição pretendida. LIKE '%lamp%' corresponde a “Desk lamp” e “Clamp”. O LIKE padrão do SQLite também ignora a diferença entre maiúsculas e minúsculas nas letras inglesas, portanto encontra “Lamp shade”. Um padrão é útil para encontrar possíveis correspondências, mas inspecione-as antes de alterá-las.

Escolha uma comparação de lista para uma lista
UPDATE orders SET status = 'on hold'
WHERE customer_id IN (
  SELECT id FROM customers WHERE state = 'CA'
);

A subconsulta pode fornecer vários identificadores de clientes; IN verifica se o valor pertence à lista. Substituir IN por = solicita um único resultado escalar. O PostgreSQL rejeita várias linhas nesse caso, enquanto o SQLite usa silenciosamente a primeira linha retornada e deixa outros clientes de fora.

Após a alteração, compare a contagem de linhas afetadas com a visualização prévia. PostgreSQL e SQLite também permitem acrescentar RETURNING * para mostrar as linhas afetadas. Para uma gravação arriscada, inicie uma transação antes de alterar os dados, inspecione o resultado e escolha COMMIT ou ROLLBACK.

Principais conclusões

  • Visualize exatamente a condição WHERE que a gravação usará.
  • Um filtro pela chave primária identifica no máximo uma linha.
  • Parênteses fazem alternativas com OR compartilharem uma condição AND.
  • IS NULL trata valores ausentes; comparações comuns os deixam de fora.
  • IN aceita uma lista de subconsulta; uma igualdade escalar não.
  • Verifique a contagem e o resultado antes de confirmar.
5

Agrupar alterações em transações

Algumas alterações devem ocorrer juntas: uma transferência precisa de uma retirada e de um depósito. As transações permitem decidir uma única vez se essas instruções serão mantidas ou desfeitas, enquanto pontos de salvamento permitem retornar a um ponto intermediário. Você acompanhará saldos durante alterações bem-sucedidas e erros e depois comparará como SQLite e PostgreSQL tratam uma instrução que falhou. As configurações do banco de dados e do cliente importam, especialmente quando uma alteração de estrutura pode confirmar trabalho anterior.

5.1 Confirmar ou desfazer um conjunto de alterações

Uma transação agrupa instruções relacionadas em uma unidade de trabalho. Você decide manter suas alterações juntas com COMMIT ou desfazê-las juntas com ROLLBACK. A propriedade de tudo ou nada é chamada de atomicidade, o A de ACID.

Mantenha os dois lados de uma transferência

A conta de Maya, ID 1, tem 500,00 reais. A conta de Leo, ID 2, tem 120,00 reais. Transferir 75,00 reais exige duas alterações:

BEGIN;
UPDATE accounts SET balance = balance - 75.00 WHERE id = 1;
UPDATE accounts SET balance = balance + 75.00 WHERE id = 2;
SELECT id, balance FROM accounts WHERE id IN (1, 2);
COMMIT;

A primeira atualização deixa Maya com 425,00 reais. A segunda deixa Leo com 195,00 reais. A verificação mostra ambos os saldos antes da confirmação, e o total permanece em 620,00 reais. Para esses saldos decimais exatos, use NUMERIC no PostgreSQL; no SQLite, uma versão com valores monetários exatos armazena 50.000 e 12.000 centavos e transfere 7500 centavos.

Sem uma transação explícita no modo de confirmação automática, a primeira atualização poderia se tornar permanente antes da execução da segunda. Uma falha entre elas manteria a retirada sem o depósito. Uma transação permite uma única decisão final para manter ou desfazer as duas atualizações. Se uma instrução falhar, trate o erro antes de decidir que a transferência está concluída.

Entenda o limite padrão

Na confirmação automática do banco de dados, cada instrução independente bem-sucedida é confirmada como sua própria transação. Esse é o comportamento inicial habitual do SQLite, PostgreSQL, MySQL e SQL Server. Uma biblioteca de programação ou cliente pode escolher configurações diferentes e iniciar uma transação para você.

BEGIN; inicia uma transação explícita no SQLite e no PostgreSQL. SQLite e SQL Server também usam BEGIN TRANSACTION; PostgreSQL e MySQL aceitam START TRANSACTION. O Oracle inicia uma transação com uma alteração de dados e normalmente espera por COMMIT em ferramentas como o SQL*Plus, a menos que a confirmação automática esteja ativada.

COMMIT encerra a transação e mantém suas alterações. ROLLBACK encerra a transação e desfaz suas alterações não confirmadas. Um rollback posterior não pode desfazer uma confirmação anterior.

Inspecione e desfaça
BEGIN;
DELETE FROM orders;
SELECT * FROM orders;
ROLLBACK;

Sua conexão vê uma tabela vazia no SELECT e depois vê os cinco pedidos novamente após o rollback. O resultado vazio era real dentro da transação, mas ainda não era permanente. Outras conexões normalmente não veem as alterações não confirmadas.

Uma transação só pode proteger contra uma seleção errada de linhas se você inspecionar o resultado e escolher desfazê-lo. A SQL pode atualizar uma linha não pretendida com sucesso: nenhuma regra do banco de dados sabe qual conta você pretendia indicar. Compare identificadores, valores e contagens retornados com o resultado pretendido antes de confirmar.

Mantenha as transações curtas e encerre-as. Transações abertas podem manter bloqueios que fazem outras conexões esperar; o SQLite permite apenas uma conexão de escrita por vez. Fechar uma conexão com uma transação inacabada desfaz suas alterações pendentes. Quando uma biblioteca inicia uma transação automaticamente, o programa precisa chamar seu método de confirmação para manter o trabalho.

Principais conclusões

  • A atomicidade permite manter ou desfazer alterações relacionadas em conjunto.
  • A confirmação automática torna permanente uma instrução independente bem-sucedida.
  • Sua conexão pode inspecionar suas próprias alterações pendentes.
  • COMMIT e ROLLBACK encerram a transação.
  • ROLLBACK não pode desfazer o trabalho de uma transação confirmada anteriormente.

5.2 Tratar erros, pontos de salvamento e alterações de estrutura em uma transação

Uma instrução que falha não tem o mesmo efeito em todos os bancos de dados. Você precisa saber o que ainda está pendente antes de decidir como se recuperar. Um ponto de salvamento pode oferecer um ponto intermediário ao qual retornar dentro de uma transação aberta.

Acompanhe um erro

Após a transferência, Maya tem 425,00 reais e Leo tem 195,00 reais. A tabela tem CHECK (balance >= 0). Inicie uma transação e subtraia 30,00 reais de Maya: seu saldo pendente é 395,00 reais. Depois, tente subtrair 300,00 reais de Leo. Isso tornaria seu saldo -105,00 reais, portanto a segunda instrução falha.

Banco de dadosEstado após o erro comum de restrição
SQLiteA instrução que falhou é desfeita; a alteração anterior de Maya continua pendente.
PostgreSQLA transação está em estado de falha, e outros comandos comuns são recusados.

No SQLite, confirmar nesse momento manteria apenas a dedução de Maya. No PostgreSQL, COMMIT em uma transação em estado de falha a encerra com um rollback. Uma rotina clara de recuperação é executar ROLLBACK, corrigir a causa e executar novamente as instruções relacionadas. Os dois saldos retornam então a 425,00 e 195,00 reais antes da tentativa corrigida.

Desfaça uma parte posterior com um ponto de salvamento
BEGIN;
UPDATE accounts SET balance = balance + 10 WHERE id = 1;
SAVEPOINT after_first;
UPDATE accounts SET balance = balance + 10 WHERE id = 2;
ROLLBACK TO after_first;
COMMIT;

O ponto de salvamento vem após o aumento de Maya. ROLLBACK TO desfaz o aumento posterior de Leo, mas preserva o de Maya. Os saldos finais são 435,00 e 195,00 reais. Ele não encerra a transação externa; COMMIT faz isso.

RELEASE after_first remove o ponto de salvamento sem desfazer as alterações feitas depois dele. Não é uma confirmação permanente independente dentro da transação externa. O PostgreSQL também permite que ROLLBACK TO um ponto de salvamento estabelecido antes de um erro limpe o estado de falha e continue a partir desse ponto.

Verifique se alterações de estrutura podem ser desfeitas

SQLite e PostgreSQL permitem CREATE TABLE, ALTER TABLE e DROP TABLE dentro de transações. Por exemplo, BEGIN; DROP TABLE orders; ROLLBACK; restaura a tabela e suas linhas.

Instruções DDL comuns em tabelas permanentes no MySQL e no Oracle causam confirmações implícitas. Um CREATE TABLE, ALTER TABLE, DROP TABLE ou TRUNCATE TABLE pode confirmar alterações pendentes anteriores além de executar sua própria operação estrutural. Um rollback posterior não pode desfazer esse trabalho anterior. Não suponha que colocar uma transação em torno de um script faça todos os dialetos de banco de dados se comportarem da mesma maneira.

Para uma alteração arriscada de dados, inicie a transação, execute a gravação, inspecione seus valores e sua contagem e então confirme ou desfaça. Por exemplo, inspecione os preços de iluminação após UPDATE products SET price = ROUND(price * 1.10, 2) WHERE category = 'lighting';. Tome a decisão prontamente para que a transação não mantenha outros trabalhos em espera.

Principais conclusões

  • Um erro comum de restrição no SQLite deixa pendentes as alterações anteriores da transação.
  • Um erro no PostgreSQL deixa a transação em estado de falha até um rollback ou uma recuperação para um ponto de salvamento.
  • ROLLBACK TO desfaz o trabalho posterior sem encerrar a transação.
  • RELEASE remove um ponto de salvamento sem confirmar a transação externa.
  • A possibilidade de desfazer DDL depende do banco de dados.
6

Alterar a estrutura das tabelas com ALTER TABLE e DROP TABLE

Às vezes, tabelas precisam de um novo campo, um nome mais claro ou uma regra mais rigorosa depois que já contêm dados. Alterar essa estrutura exige verificar as linhas existentes e os objetos que dependem da tabela. Você adicionará e preencherá colunas, reconhecerá quando o SQLite precisa de uma reconstrução e distinguirá a remoção de registros da remoção de seu recipiente. As dependências também determinam a ordem do trabalho quando tabelas relacionadas são retiradas de uso.

6.1 Adicionar, renomear e remover colunas com ALTER TABLE

ALTER TABLE altera a estrutura de uma tabela existente preservando suas linhas. UPDATE altera os valores contidos nessas linhas. Adicionar um campo de desconto exige ALTER TABLE; aumentar os descontos já armazenados exige UPDATE.

Adicione e renomeie campos
ALTER TABLE customers ADD COLUMN phone TEXT;
ALTER TABLE customers RENAME COLUMN phone TO mobile;
ALTER TABLE customers RENAME TO clients;

SQLite e PostgreSQL compartilham essas formas. Uma nova coluna atribui às linhas existentes seu valor padrão ou NULL quando não há um. ADD COLUMN active INTEGER NOT NULL DEFAULT 1 atribui a cada linha atual o valor 1 em active. Adicionar email TEXT NOT NULL sem valor padrão falha em uma tabela com dados porque as linhas existentes não teriam um valor obrigatório.

O SQLite oferece suporte a RENAME COLUMN a partir da versão 3.25.0 e a DROP COLUMN a partir da 3.35.0. Ao renomear, atualize o código de aplicações e as consultas salvas que fazem referência ao nome antigo. A SQL fora do banco de dados não pode descobrir o novo nome automaticamente.

Preencha os dados antes de exigi-los

No PostgreSQL, adicione uma coluna que aceite valores ausentes, preencha as linhas existentes com valores adequados e só então torne-a obrigatória:

ALTER TABLE customers ADD COLUMN email TEXT;
UPDATE customers SET email = 'unknown@example.com'
WHERE email IS NULL;
ALTER TABLE customers ALTER COLUMN email SET NOT NULL;

Isso ilustra o preenchimento de um campo obrigatório; não declara o e-mail como único. Uma coluna real de e-mail único precisa de valores válidos e distintos. SET NOT NULL falha se ainda houver valores ausentes. O PostgreSQL também permite alterar um tipo com ALTER COLUMN price TYPE NUMERIC(10, 2), definir um valor padrão e adicionar uma verificação nomeada. As linhas existentes devem satisfazer uma regra recém-adicionada.

Remova um campo ou reconstrua uma tabela

ALTER TABLE customers DROP COLUMN mobile; remove o campo e todos os seus valores armazenados. Dependências podem bloquear a operação. O SQLite rejeita a remoção de uma coluna de chave primária, única, indexada ou de chave estrangeira, ou de uma coluna usada por outro objeto do esquema. O PostgreSQL pode remover objetos dependentes com CASCADE, incluindo uma visão que usa a coluna.

O SQLite não pode alterar o tipo de uma coluna existente nem adicionar restrições de chave primária, unicidade, chave estrangeira ou verificação a colunas existentes com um ALTER simples. A versão 3.53.0 adiciona ALTER COLUMN ... SET NOT NULL e DROP NOT NULL, não a edição geral de restrições. Uma coluna recém-adicionada pode ter uma verificação ou referência permitida, mas não pode ter PRIMARY KEY ou UNIQUE; com chaves estrangeiras ativadas, uma referência adicionada precisa de um valor padrão NULL.

Para uma alteração mais ampla no SQLite:

  1. Registre os índices, gatilhos e visões que precisam ser recriados. Se as chaves estrangeiras estiverem ativadas, desative-as antes da transação.
  2. Inicie uma transação e crie uma nova tabela com as regras desejadas.
  3. Copie as linhas usando colunas explícitas em INSERT INTO new_products (...) SELECT ... FROM products;.
  4. Remova a tabela antiga e renomeie a nova para products.
  5. Recrie os objetos dependentes e execute PRAGMA foreign_key_check;. Resolva quaisquer problemas informados antes de confirmar.
  6. Confirme e depois restaure a aplicação das restrições de chave estrangeira se ela estava ativada antes.

O MySQL altera definições com MODIFY COLUMN; o SQL Server usa ALTER COLUMN. Converta uma alteração estrutural para a sintaxe aceita pelo banco de dados de destino antes de executá-la.

Principais conclusões

  • ALTER TABLE altera a estrutura; UPDATE altera valores armazenados.
  • Colunas adicionadas atribuem às linhas existentes um valor padrão ou NULL.
  • Preencha uma nova coluna obrigatória antes de adicionar NOT NULL.
  • Remover uma coluna apaga seus valores e pode ser bloqueado por dependências.
  • O SQLite precisa de uma reconstrução para muitas alterações de tipo e restrição.
  • Reconstruções devem preservar objetos dependentes e verificar chaves estrangeiras.

6.2 Remover tabelas com DROP TABLE

DROP TABLE remove o recipiente e também seu conteúdo. Após DROP TABLE archived_orders;, consultas não podem ler essa tabela porque ela não existe mais. Suas restrições, índices e gatilhos são removidos com ela.

Escolha o nível de remoção
Resultado pretendidoInstrução
Manter a tabela e remover linhas selecionadasDELETE FROM orders WHERE ...;
Manter uma tabela vaziaDELETE FROM orders;
Esvaziar rapidamente uma tabela quando houver suporteTRUNCATE TABLE orders;
Remover a própria tabelaDROP TABLE orders;

DROP TABLE IF EXISTS archived_orders; evita um erro se a tabela estiver ausente. Ainda assim, remove uma tabela existente e seus dados. Um script de configuração que remove e recria tabelas é destrutivo quando executado em um banco de dados com registros que você deseja manter.

Respeite os vínculos entre tabelas

Remova as tabelas filhas antes das pai, invertendo a ordem habitual de criação. No PostgreSQL, remover customers enquanto uma chave estrangeira de pedidos depende dela falha. DROP TABLE customers CASCADE; também remove a chave estrangeira dependente e quaisquer visões dependentes. A tabela de pedidos e suas linhas permanecem, mas o relacionamento com o cliente deixa de ser imposto.

Esse CASCADE do PostgreSQL é diferente do ON DELETE CASCADE de uma chave estrangeira. O primeiro remove objetos dependentes do banco de dados durante uma alteração de estrutura. O segundo remove linhas filhas quando uma linha pai é excluída. Saber qual ação está em uso evita uma previsão incorreta sobre os dados restantes.

No SQLite, com a aplicação de restrições de chave estrangeira ativada, remover uma tabela primeiro executa uma exclusão implícita de suas linhas. Linhas filhas que fazem referência a elas podem bloquear a operação. Se o relacionamento declarar ON DELETE CASCADE, essas linhas filhas podem ser excluídas; SET NULL pode apagar seus vínculos. Portanto, uma remoção de tabela exige a mesma atenção às referências que uma exclusão de linhas, além de atenção à estrutura da tabela removida.

Preserve uma forma de recuperação

Antes de remover ou reconstruir uma tabela com dados reais, preserve uma cópia utilizável. Uma cópia interna rápida dos dados é:

CREATE TABLE products_backup AS
SELECT * FROM products;

No SQLite e no PostgreSQL, isso preserva os dados selecionados, mas não as restrições originais. Não serve como uma reconstrução completa da definição da tabela. Uma exportação ou backup do banco de dados mantém dados para recuperação fora da tabela alterada.

SQLite e PostgreSQL também permitem testar uma remoção dentro de uma transação:

BEGIN;
DROP TABLE archived_orders;
ROLLBACK;

O rollback restaura a tabela e suas linhas porque a remoção não foi confirmada. Depois de confirmada, a remoção não pode ser revertida executando ROLLBACK posteriormente. Em bancos de dados com confirmações implícitas de DDL, envolver a remoção em uma sintaxe de transação não oferece essa oportunidade de desfazê-la. Inspecione o banco de dados de destino e as tabelas envolvidas antes de executar um script de reconstrução.

Principais conclusões

  • DROP TABLE remove a tabela e suas linhas, restrições, índices e gatilhos.
  • IF EXISTS suprime um erro de ausência, não a exclusão de uma tabela existente.
  • Remova as tabelas filhas antes das respectivas tabelas pai.
  • DROP CASCADE no PostgreSQL remove objetos dependentes, enquanto as tabelas filhas podem permanecer.
  • Uma cópia apenas dos dados não preserva as restrições originais.

Exercícios resolvidos de Criação de tabelas e alteração de dados

6 Lições Interativas

1

Criar e inspecionar uma tabela de produtos

11 passos
Definir uma tabela vazia, verificar suas colunas e escolher um armazenamento adequado a cada valor.
  1. 1
    IntroduçãoComece com um produto

    Uma loja precisa registrar o identificador, o nome, o preço e a quantidade em estoque de um produto. Uma definição de tabela dá a cada informação seu próprio campo antes que qualquer linha de produto seja adicionada.

    Vamos criar a estrutura, inspecioná-la e verificar se os tipos preservam o significado dos valores. Os exemplos usam SQLite e indicam as mudanças no PostgreSQL quando elas afetam o resultado.

  2. 2
    ExplicaçãoLeia uma definição de coluna

    Em name TEXT NOT NULL, name é o identificador do campo, TEXT descreve seu armazenamento e NOT NULL exige um valor.

    A tabela lista essas definições entre parênteses, separadas por vírgulas. O ponto e vírgula encerra a instrução de criação. Criar a estrutura é DDL; isso não adiciona nenhuma linha de produto. Um INSERT posterior fornece essas linhas.

  3. 3
    ExemploCrie quatro campos
    CREATE TABLE products (
      id INTEGER PRIMARY KEY,
      name TEXT NOT NULL,
      price NUMERIC(8, 2) NOT NULL,
      in_stock INTEGER DEFAULT 0
    );
    

    Há quatro definições de coluna e três vírgulas de separação. O SQLite gera essa chave primária inteira. O PostgreSQL precisa de uma declaração de identidade se um identificador omitido deve ser gerado.

  4. 4
    DicaInspecione a definição real

    Use PRAGMA table_info(products); na SQL do SQLite ou .schema products em seu terminal de linha de comando. No psql do PostgreSQL, use \d products.

    A inspeção detecta mais do que erros de sintaxe. O SQLite pode ler uma vírgula ausente como parte de um nome de tipo com várias palavras, deixando uma coluna onde você esperava duas. SELECT * FROM products; mostra uma tabela vazia, mas suas zero linhas não verificam todas as regras.

  5. 5
    DesafioIsso corrigirá uma tabela antiga?

    Uma tabela products antiga tem apenas id e name. Um script executa CREATE TABLE IF NOT EXISTS products (...) com quatro colunas desejadas. Quantas colunas a tabela existente terá depois?

    ---reveal---

    Ela ainda terá duas. IF NOT EXISTS ignora a criação quando o nome está presente. Não compara as definições nem adiciona os campos ausentes. Uma alteração estrutural exige ALTER TABLE ou uma reconstrução planejada.

  6. 6
    ExplicaçãoSepare quantidades de códigos

    Armazene quantidades como números para que a aritmética e a ordenação numérica funcionem. Armazene códigos como texto quando seus caracteres tiverem significado.

    O código postal dos EUA '02139' perde o zero inicial como inteiro. Os valores de texto '100', '25' e '9' são ordenados nessa ordem de caracteres, que é incorreta para quantidades numéricas. A decisão depende de como o campo será usado, não de seus exemplos conterem dígitos.

  7. 7
    ExemploLeia precisão e escala

    NUMERIC(8, 2) no PostgreSQL permite oito dígitos no total, com dois após a vírgula. Isso deixa seis antes dela, até 999.999,99.

    Um valor de 12,345 é armazenado como 12,35. Um valor de 1.234.567,00 falha porque precisa de sete dígitos antes da vírgula. O SQLite aceita a mesma declaração, mas não impõe essa precisão nem essa escala, portanto essa previsão não se aplica ao SQLite.

  8. 8
    Ideia-chaveMantenha valores monetários exatos

    O ponto flutuante binário pode introduzir pequenas diferenças na aritmética decimal. SELECT 0.1 + 0.2 = 0.3; no SQLite retorna falso.

    Use NUMERIC no PostgreSQL para valores decimais exatos. No SQLite, armazene centavos inteiros como inteiros: 1999 representa 19,99. Escrever NUMERIC(8, 2) no SQLite não cria armazenamento decimal exato de escala fixa. Tipos aproximados continuam adequados para medições como temperaturas.

  9. 9
    DesafioMantenha as datas em ordem

    Uma tabela do SQLite armazena datas como texto. Por que mudar '12/01/2025' e '03/15/2026' para datas ISO ajuda em uma ordenação crescente por data?

    ---reveal---

    As formas ISO são '2025-12-01' e '2026-03-15'. A comparação de texto verifica então ano, mês e dia nessa ordem, colocando a data anterior primeiro. O texto com mês primeiro compara o mês antes de chegar ao ano e coloca essas duas datas na ordem cronológica errada.

  10. 10
    DesafioVerifique a tabela e o tipo

    Um script SQLite cria uma tabela ausente com CREATE TABLE IF NOT EXISTS readings (qty INTEGER);. Uma inserção fornece 'abc' como qty e é bem-sucedida. O que você deve verificar antes de supor que qty sempre contém números?

    ---reveal---

    Inspecione a definição real, pois IF NOT EXISTS pode ter ignorado uma tabela antiga. Considere também a afinidade comum do SQLite: uma declaração de inteiro ainda pode armazenar texto não numérico. Uma tabela STRICT adequada reforça a aplicação dos tipos.

  11. 11
    RecapitulaçãoRelacione a estrutura ao uso

    Uma instrução de criação define campos, tipos e regras; uma inserção fornece os registros. Inspecione a estrutura existente em vez de supor que um script bem-sucedido criou a definição pretendida.

    Para cada campo, pergunte o que deve ser preservado: aritmética numérica, centavos exatos, caracteres de identificadores ou ordem cronológica. Aplique o comportamento de tipos do banco de dados de destino ao prever o resultado armazenado.

2

Proteger produtos e vínculos com clientes

13 passos
Acompanhar verificações de restrições, escolher chaves geradas e prever ações de chave estrangeira.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoVerifique os dados no banco
  2. 2
    ExplicaçãoDê uma função a cada regra
  3. 3
    ExemploAcompanhe uma linha aceita
  4. 4
    DesafioUm valor padrão corrige um NULL explícito?
  5. 5
    Ideia-chaveUm resultado desconhecido passa pela verificação
  6. 6
    ExplicaçãoIdentifique a linha inteira
  7. 7
    ExemploDeixe o sistema escolher o identificador
  8. 8
    DesafioO próximo identificador é uma contagem de linhas?
  9. 9
    ExplicaçãoFaça cada pedido encontrar seu cliente
  10. 10
    ExemploAcompanhe uma ação em cascata
  11. 11
    DesafioMantenha os pedidos após a remoção
  12. 12
    DesafioCombine as regras necessárias
  13. 13
    RecapitulaçãoVerifique valores, identidade e vínculos
3

Inserir produtos e copiar pedidos

11 passos
Associar valores a colunas, inspecionar linhas copiadas e distinguir substituição de acréscimo de estoque.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoEscolha a origem das novas linhas
  2. 2
    ExemploAssocie os campos de um produto
  3. 3
    DicaMantenha os valores literais intactos
  4. 4
    DesafioLeia a lista explícita
  5. 5
    ExplicaçãoAdicione um grupo em uma instrução
  6. 6
    ExemploVisualize a consulta de arquivamento
  7. 7
    ExemploUse a consulta como entrada
  8. 8
    ExplicaçãoIdentifique a linha proposta
  9. 9
    DesafioManter ou substituir?
  10. 10
    DesafioCopie e vincule sem adivinhar
  11. 11
    RecapitulaçãoAcompanhe a entrada durante a gravação
4

Alterar exatamente as linhas pretendidas

14 passos
Aplicar atualizações calculadas, acompanhar exclusões e testar filtros antes de manter uma alteração.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoSepare o que muda de quais linhas mudam
  2. 2
    ExemploAtribua dois novos valores
  3. 3
    ExemploAumente um preço a partir do valor antigo
  4. 4
    DesafioOs outros preços mudarão?
  5. 5
    ExplicaçãoRemova uma linha ou apague um campo
  6. 6
    ExemploAcompanhe os pedidos cancelados antigos
  7. 7
    DesafioMantenha o histórico de um cliente excluído
  8. 8
    DicaReutilize a condição visualizada
  9. 9
    ExemploAplique AND antes de OR
  10. 10
    DesafioAplique uma regra de data aos dois status
  11. 11
    Ideia-chaveUma comparação negativa deixa NULL de fora
  12. 12
    DesafioUse uma lista de chaves de clientes
  13. 13
    DesafioInspecione uma atualização de todas as linhas
  14. 14
    RecapitulaçãoVerifique o significado e o efeito
5

Manter ou desfazer uma alteração completa

12 passos
Acompanhar uma transferência, recuperar-se de erros e usar um ponto de salvamento sem perder a transação externa.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoUma transferência precisa de duas alterações
  2. 2
    ExplicaçãoAbra um limite comum
  3. 3
    ExemploSubtraia o valor da transferência
  4. 4
    ExemploAdicione e inspecione o depósito
  5. 5
    DesafioDesfaça toda a transferência pendente
  6. 6
    ExemploAcompanhe uma alteração de saldo que falhou
  7. 7
    ExplicaçãoRecupere-se conforme o banco de dados
  8. 8
    DesafioEvite manter uma operação incompleta
  9. 9
    ExemploMarque um ponto intermediário
  10. 10
    Ideia-chaveLiberar não confirma a transação externa
  11. 11
    DesafioEssa remoção de tabela pode ser desfeita?
  12. 12
    RecapitulaçãoEncerre com uma decisão deliberada
6

Alterar ou remover uma tabela com dados

13 passos
Adicionar dados obrigatórios em etapas, reconstruir tabelas SQLite quando necessário e seguir as dependências durante remoções.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoTrabalhe com registros já presentes
  2. 2
    ExemploAdicione um campo que aceite valores ausentes
  3. 3
    DesafioTorne um campo obrigatório após preenchê-lo
  4. 4
    DicaRenomeie todos os usos externos
  5. 5
    ExplicaçãoReconheça um ALTER limitado
  6. 6
    ExemploPrepare a substituição
  7. 7
    ExemploCopie, substitua e verifique
  8. 8
    ExplicaçãoDecida se a tabela deve permanecer
  9. 9
    ExemploAcompanhe as dependências no PostgreSQL
  10. 10
    DesafioSepare os dois significados de cascata
  11. 11
    DicaMantenha dados e definição recuperáveis
  12. 12
    DesafioMantenha as regras durante uma reconstrução
  13. 13
    RecapitulaçãoAcompanhe a estrutura e suas dependências

Questões de Criação de tabelas e alteração de dados

50 Questões de Prática em 5 conjuntos

Conjunto 1: Criar tabelas e fazer as primeiras alterações10 Questões de Prática

Questão 1 de 10

Um novo campo no SQLite deve preservar exatamente o código de conta 00481. Qual tipo de armazenamento é adequado?
  1. INTEGER
  2. TEXT
  3. REAL
  4. NUMERIC(5, 0)
Mostrar respostaOcultar resposta
Resposta: B
O código é um identificador cujos caracteres devem ser preservados, portanto o texto mantém os dois zeros iniciais. O armazenamento numérico trata esses zeros como sem efeito numérico e não preserva essa forma escrita. A precisão numérica descreve o armazenamento de números, não um formato de identificador de comprimento fixo.

Questão 2 de 10

Uma coluna do PostgreSQL usa NUMERIC(6, 2). Qual é seu maior valor positivo?
  1. 999999,99
  2. 99,9999
  3. 999999
  4. 9999,99
Mostrar respostaOcultar resposta
Resposta: D
A precisão é de seis dígitos no total, e a escala reserva dois deles para casas decimais, deixando quatro antes da vírgula. O máximo é, portanto, 9999,99. Tratar seis como o número de dígitos antes da vírgula permitiria dígitos demais no total.

Questão 3 de 10

Uma coluna do SQLite é qty INTEGER NOT NULL DEFAULT 4 CHECK (qty >= 0). Uma inserção fornece NULL explicitamente para qty. O que acontece?
  1. A inserção falha na regra NOT NULL.
  2. A linha é inserida com quantidade 4.
  3. A linha é inserida com quantidade 0.
  4. A linha é inserida com quantidade NULL.
Mostrar respostaOcultar resposta
Resposta: A
Um NULL explícito é verificado como um valor ausente fornecido, portanto viola NOT NULL. O valor padrão 4 é usado quando a coluna é omitida, não quando um valor ausente é enviado explicitamente. A verificação de valor não negativo não substitui a regra de presença.

Questão 4 de 10

Uma tabela do PostgreSQL precisa gerar identificadores quando inserções omitem id. Qual definição de coluna fornece esse comportamento?
  1. id INTEGER PRIMARY KEY NOT NULL CHECK (id > 0)
  2. id INTEGER UNIQUE NOT NULL DEFAULT 1
  3. id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY
  4. id INTEGER NOT NULL CHECK (id >= 1)
Mostrar respostaOcultar resposta
Resposta: C
Uma declaração de identidade fornece um valor gerado por sequência, enquanto a chave primária garante a identidade da linha. Uma chave primária inteira simples apenas verifica os valores fornecidos; ela não gera um identificador omitido. Um valor padrão constante de 1 repetiria o mesmo valor em vez de gerar novos identificadores.

Questão 5 de 10

As restrições de chave estrangeira são aplicadas. Uma linha filha usa supplier_id = 18, mas o fornecedor 18 não existe. O que deve ser feito para inserir com sucesso essa mesma referência não NULL?
  1. Adicionar outra chave primária à linha filha.
  2. Confirmar a linha filha antes de adicionar o fornecedor.
  3. Criar primeiro a linha do fornecedor correspondente.
  4. Atribuir a supplier_id um valor padrão não NULL.
Mostrar respostaOcultar resposta
Resposta: C
O valor fornecido pela linha filha deve corresponder a uma chave pai existente, portanto o fornecedor 18 deve existir antes de essa referência ser inserida sob a verificação imediata comum. Uma chave filha diferente não corrige a ausência da linha pai. Um valor padrão não substitui o 18 fornecido explicitamente.

Questão 6 de 10

Uma tabela declara name antes de code. Uma inserção usa (code, name) com os valores ('R7', 'Notebook'). O que é armazenado em name?
  1. O texto Notebook.
  2. O texto R7.
  3. O texto R7, Notebook.
  4. Um valor ausente, NULL.
Mostrar respostaOcultar resposta
Resposta: A
A lista explícita de colunas controla a associação: o segundo valor vai para a segunda coluna listada, name. A ordem de declaração da tabela não se sobrepõe a essa lista. Ler os valores na ordem da tabela trocaria incorretamente o código e o nome.

Questão 7 de 10

Uma linha tem qty 9. Qual atribuição reduz a quantidade armazenada em 3?
  1. SET qty = 3
  2. SET qty = 9 - qty
  3. SET qty = qty * 3
  4. SET qty = qty - 3
Mostrar respostaOcultar resposta
Resposta: D
O novo valor deve ser calculado a partir da quantidade armazenada, portanto subtrair 3 deixa 6. Atribuir a constante 3 substitui a quantidade por 3 e não significa uma redução de 3. Usar a coluna na expressão também aplica a mesma alteração relativa a outras quantidades.

Questão 8 de 10

Uma tabela contém 12 linhas. DELETE FROM logs; é executado com sucesso. O que permanece?
  1. A definição de logs e todas as 12 linhas.
  2. Uma tabela logs vazia com sua definição.
  3. Nenhuma tabela logs e nenhuma linha restante.
  4. Uma linha de logs com valores ausentes.
Mostrar respostaOcultar resposta
Resposta: B
Sem um filtro, DELETE remove todas as 12 linhas e deixa a estrutura da tabela disponível para inserções posteriores. Ele não remove colunas nem substitui os registros por valores ausentes. Remover a própria tabela exige DROP TABLE, uma operação estrutural separada.

Questão 9 de 10

Uma conexão SQLite executa BEGIN, altera uma quantidade de 8 para 11 e depois executa ROLLBACK. Qual quantidade essa conexão lê em seguida?
  1. 11
  2. 3
  3. 0
  4. 8
Mostrar respostaOcultar resposta
Resposta: D
A alteração de 8 para 11 ainda estava pendente na transação aberta. Um rollback completo a desfaz e restaura o valor anterior 8. O aumento de 3 é uma quantidade de alteração, não a quantidade restaurada; nenhuma etapa confirmada tornou 11 permanente.

Questão 10 de 10

Uma tabela do PostgreSQL tem linhas existentes e não tem coluna de telefone. Cada linha deverá ter seu próprio número de telefone real, e nenhum valor padrão único é adequado. Qual sequência atende a esse requisito?
  1. Adicionar phone aceitando valores ausentes; preencher telefones válidos; definir NOT NULL.
  2. Adicionar phone como NOT NULL; preencher telefones válidos; remover seu valor padrão.
  3. Adicionar phone aceitando valores ausentes; definir NOT NULL; preencher telefones válidos.
  4. Adicionar phone com DEFAULT NULL; definir NOT NULL; preencher telefones válidos.
Mostrar respostaOcultar resposta
Resposta: A
Adicionar um campo que aceita valores ausentes permite que os registros existentes permaneçam válidos enquanto seus números de telefone reais são preenchidos. Somente após resolver todos os valores ausentes SET NOT NULL pode ser executado com sucesso. Exigir os valores antes de preenchê-los falha porque as linhas existentes ainda conteriam NULL.
Conjunto 2: Diagnosticar erros comuns de SQL10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Uma tabela labels do SQLite já tem apenas as colunas id e text. Um script executa CREATE TABLE IF NOT EXISTS labels (id INTEGER PRIMARY KEY, text TEXT, color TEXT);. O que acontece com color?
  1. É adicionada e preenchida com valores ausentes.
  2. Substitui a coluna text existente.
  3. Não é adicionada à tabela existente.
  4. É adicionada apenas após a próxima inserção.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Um script executa CREATE TABLE tickets (id INTEGER PRIMARY KEY, label TEXT);. Nenhuma outra instrução é executada. O que existe depois?
  1. Uma tabela com uma linha para cada coluna.
  2. Uma tabela vazia com duas colunas.
  3. Uma tabela vazia apenas com a coluna id.
  4. Duas tabelas vazias chamadas id e label.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

No PostgreSQL, uma coluna score que aceita valores ausentes tem apenas CHECK (score BETWEEN 0 AND 100). Uma inserção fornece NULL. O que acontece?
  1. É rejeitado porque a verificação é falsa.
  2. É armazenado como o limite inferior, zero.
  3. É aceito depois que NULL se torna 100.
  4. É aceito porque a verificação é desconhecida.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Um projeto tem duas tarefas. A chave estrangeira project_id delas usa ON DELETE SET NULL, e project_id também é NOT NULL. As restrições de chave estrangeira são aplicadas. O que acontece quando o projeto é excluído?
  1. A exclusão falha; o projeto e as duas tarefas permanecem.
  2. O projeto é removido e as duas tarefas ficam desvinculadas.
  3. O projeto e suas duas tarefas são removidos.
  4. A exclusão é bem-sucedida e as duas tarefas mantêm a chave antiga.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

O estoque do código R2 é 7. Um registro recebido informa uma contagem substituta de 11. Qual atribuição de inserção ou atualização armazena a contagem pretendida?
  1. SET qty = stock.qty + excluded.qty
  2. SET qty = excluded.qty
  3. SET qty = stock.qty - excluded.qty
  4. SET qty = stock.qty
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Uma tabela tem status ausentes e não ausentes. Uma gravação deve selecionar todas as linhas cujo status não é pago, incluindo status ausentes. Qual condição funciona?
  1. status <> 'paid' AND status IS NULL
  2. status <> 'paid' OR status = NULL
  3. status <> 'paid' OR status IS NULL
  4. status <> 'paid' AND status IS NOT NULL
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Uma gravação deve definir a cor e a quantidade de uma linha. Como as duas atribuições são separadas dentro de SET?
  1. Com uma vírgula.
  2. Com AND.
  3. Com WHERE.
  4. Com outro SET.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Uma transação SQLite começa com saldos de 80 e 40. Uma primeira atualização subtrai 15 do primeiro saldo. Uma segunda atualização subtrai 50 do segundo e falha em CHECK (balance >= 0). No tratamento comum de restrições, o que COMMIT manteria?
  1. Saldos de 80 e 40.
  2. Saldos de 65 e -10.
  3. Saldos de 80 e -10.
  4. Saldos de 65 e 40.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Uma tabela do SQLite com dados recebe active INTEGER NOT NULL DEFAULT 1. Qual valor de active suas linhas existentes têm?
  1. NULL
  2. 1
  3. 0
  4. Seus identificadores de linha.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Uma tabela de arquivo temporária deve deixar de existir, incluindo suas linhas e definição. Qual instrução realiza essa remoção?
  1. DELETE FROM archive;
  2. TRUNCATE TABLE archive;
  3. DROP TABLE archive;
  4. ALTER TABLE archive RENAME TO old_archive;
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 3: Acompanhar os resultados armazenados10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Um campo do PostgreSQL é NUMERIC(5, 2). O que acontece com um valor inserido de 48,726?
  1. É armazenado como 48,73.
  2. É armazenado como 48,72.
  3. É armazenado como 48,726.
  4. Falha por exceder cinco dígitos no total.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Uma tabela tem UNIQUE (room_id, start_time). Ela contém (4, '09:00') e (5, '09:00'). O que acontece quando (4, '10:00') é inserido?
  1. Falha porque a sala 4 é repetida.
  2. Falha porque duas salas compartilham 09:00.
  3. Substitui o registro da sala 4.
  4. É bem-sucedida porque o par é novo.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Em uma tabela comum do SQLite, uma chave primária de texto obrigatória é declarada como code TEXT PRIMARY KEY. Qual regra adicional elimina a exceção histórica do SQLite para chaves ausentes?
  1. Adicionar DEFAULT NULL.
  2. Adicionar CHECK (code = code).
  3. Adicionar NOT NULL.
  4. Adicionar outro UNIQUE.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Uma inserção comum de várias linhas no PostgreSQL propõe três registros. O último repete um código único existente. O que acontece com os dois primeiros registros propostos?
  1. Ambos são inseridos antes do erro.
  2. Nenhum dos dois é inserido por essa instrução.
  3. Apenas o primeiro registro é inserido.
  4. Ambos são inseridos com códigos ausentes.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Uma tabela do SQLite tem id gerado, name obrigatório e qty INTEGER NOT NULL DEFAULT 6. Qual inserção adiciona uma escova usando esse valor padrão?
  1. INSERT INTO tools (name, qty) VALUES ('Brush', NULL);
  2. INSERT INTO tools (name, qty) VALUES ('Brush', DEFAULT);
  3. INSERT INTO tools (id, name) VALUES ('Brush', 6);
  4. INSERT INTO tools (name) VALUES ('Brush');
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Uma linha de cliente deve permanecer, mas seu valor opcional de telefone deve se tornar ausente. Qual instrução faz isso?
  1. DELETE FROM clients WHERE id = 28;
  2. UPDATE clients SET phone = NULL WHERE id = 28;
  3. UPDATE clients SET phone = 'NULL' WHERE id = 28;
  4. ALTER TABLE clients DROP COLUMN phone;
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Os casos são 71 (fechado, 2025-08-01), 72 (aberto, 2026-02-02), 73 (fechado, 2026-03-01) e 74 (expirado, 2025-09-01). Quais identificadores correspondem a state = 'closed' OR state = 'expired' AND opened < '2026-01-01'?
  1. 71, 73 e 74.
  2. Apenas 71 e 74.
  3. Apenas 71 e 73.
  4. Apenas 73 e 74.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Uma transação explícita aumenta uma contagem de 5 para 8. Antes da confirmação, a mesma conexão consulta a linha. Qual contagem ela lê?
  1. 5
  2. 3
  3. 8
  4. Nenhuma linha até a confirmação.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Uma transação começa com os contadores a = 2 e b = 7. Ela aumenta a em 3, define o ponto de salvamento s, aumenta b em 4, executa ROLLBACK TO s e confirma. O que permanece?
  1. a = 5 e b = 7.
  2. a = 2 e b = 7.
  3. a = 5 e b = 11.
  4. a = 2 e b = 11.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

No PostgreSQL, invoices faz referência a clients por uma chave estrangeira. DROP TABLE clients CASCADE; é executado com sucesso. O que pode permanecer de invoices?
  1. Sua tabela, com todas as linhas de faturas removidas.
  2. Suas linhas, ainda vinculadas pela chave estrangeira antiga.
  3. Nenhuma tabela invoices, porque ela fazia referência a clients.
  4. Suas linhas e sua tabela, sem essa chave estrangeira.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 4: Escolher uma sequência confiável10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

No SQLite, CREATE TABLE t (a INTEGER b TEXT); é executado com sucesso. A inspeção mostra apenas a coluna a. Por quê?
  1. O SQLite criou b apenas após a primeira inserção.
  2. O SQLite reuniu tipos de dados iguais em uma coluna.
  3. O SQLite tratou b como um valor padrão ausente.
  4. O SQLite leu as palavras restantes como um nome de tipo.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Uma tabela do PostgreSQL com coluna de identidade tem atualmente os identificadores 2, 6 e 9. Quantas linhas COUNT(*) retorna?
  1. 9
  2. 7
  3. 3
  4. 6
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

As restrições de chave estrangeira são aplicadas. A equipe 8 tem os membros 81 e 82; a equipe 9 tem o membro 83. A chave estrangeira dos membros aceita valores ausentes e tem ON DELETE SET NULL. Após a exclusão da equipe 8, quantos membros permanecem vinculados a uma equipe?
  1. Três membros, sem nenhum desvinculado.
  2. Um membro, com dois membros desvinculados.
  3. Um membro, com os outros dois excluídos.
  4. Nenhum membro, com três membros desvinculados.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Com a confirmação automática ativada e sem transação explícita, uma origem tem os identificadores 61 e 62 antes de uma data limite e o identificador 63 depois dela. Um destino vazio tem uma chave primária em id. Um INSERT SELECT filtrado copia os identificadores anteriores ao limite, e depois a mesma instrução é executada novamente sem uma cláusula de conflito. Qual é o estado final do destino?
  1. Identificadores 61 e 62 uma vez cada; a segunda cópia falha.
  2. Identificadores 61 e 62 duas vezes cada; ambas as cópias são bem-sucedidas.
  3. Identificadores 61, 62 e 63 uma vez cada; a segunda cópia falha.
  4. Nenhuma linha no destino; a segunda cópia desfaz a primeira.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Uma linha de estoque no PostgreSQL tem o código K8 e qty 14. Uma instrução propõe (K8, 6) com ON CONFLICT (code) DO UPDATE SET qty = stock.qty + excluded.qty. A mesma instrução é executada novamente. Qual qty é armazenado?
  1. 20
  2. 12
  3. 26
  4. 14
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Uma atualização bem-sucedida no SQLite corresponde a quatro linhas, todas já com active = 1, e define active = 1. Qual contagem changes() informa?
  1. 0
  2. 1
  3. 8
  4. 4
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Os pedidos têm os seguintes status: 91 (cancelado, 2025-04-01), 92 (NULL, 2025-05-01), 93 (cancelado, 2026-02-01), 94 (pago, 2025-06-01). Qual condição seleciona pedidos cancelados ou com status ausente somente antes de 2026?
  1. (status = 'cancelled' OR status IS NULL) AND day < '2026-01-01'
  2. status = 'cancelled' OR status IS NULL AND day < '2026-01-01'
  3. (status = 'cancelled' OR status = NULL) AND day < '2026-01-01'
  4. (status = 'cancelled' AND status IS NULL) AND day < '2026-01-01'
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Com a confirmação automática ativada, um UPDATE independente é bem-sucedido. Um segundo UPDATE independente falha e, em seguida, ROLLBACK é executado. O que acontece com a primeira atualização?
  1. É desfeita também.
  2. Permanece confirmada.
  3. Aguarda um COMMIT.
  4. É aplicada novamente depois.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

As tabelas dependem umas das outras nesta ordem: line_items faz referência a sales, e sales faz referência a buyers. As três devem ser removidas sem cascata. Qual ordem respeita suas dependências?
  1. buyers, depois sales, depois line_items.
  2. sales, depois line_items, depois buyers.
  3. line_items, depois sales, depois buyers.
  4. line_items, depois buyers, depois sales.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Uma tabela do SQLite é copiada com CREATE TABLE saved AS SELECT * FROM original;. O que deve ser verificado antes de tratar saved como uma substituta completa?
  1. Suas restrições, que não foram copiadas.
  2. Suas linhas, que estão sempre ausentes.
  3. Seu vínculo com a origem, que é atualizado para sempre.
  4. Seu nome, que ainda deve ser original.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 5: Aplicar as regras a alterações combinadas10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Uma tabela comum do SQLite declara value NUMERIC(7, 2). A inserção de 6,789 é bem-sucedida. Qual valor armazenado você deve esperar apenas com base nessa declaração?
  1. 6,79
  2. 6,789
  3. 6,78
  4. 679
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Um campo do PostgreSQL é label TEXT NOT NULL, sem outras regras. O que acontece quando o valor fornecido é uma cadeia de caracteres vazia?
  1. É aceita como texto vazio presente.
  2. É rejeitada como valor ausente.
  3. É preenchida com um espaço antes do armazenamento.
  4. É aceita após conversão para NULL.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

No SQLite com restrições ativadas, um vínculo filho é parent_id INTEGER DEFAULT 90 REFERENCES parents(id) ON DELETE SET DEFAULT. A linha pai 90 não existe. A linha filha 12 aponta para a linha pai 7. O que acontece quando a linha pai 7 é excluída?
  1. A linha filha permanece e seu vínculo passa a ser 90.
  2. A linha filha permanece e seu vínculo passa a ser NULL.
  3. A linha pai e sua linha filha são excluídas.
  4. A exclusão falha porque o valor padrão não tem linha pai.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Uma linha de estoque tem quantidade 9. Dois registros de entrega propõem 4 cada um, mas ambos executam DO UPDATE SET qty = excluded.qty. Qual quantidade é armazenada após as duas importações e qual total a adição correta teria produzido?
  1. Armazenado: 4; total correto das entregas: 13.
  2. Armazenado: 8; total correto das entregas: 17.
  3. Armazenado: 4; total correto das entregas: 17.
  4. Armazenado: 9; total correto das entregas: 8.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Uma chave estrangeira aplicada usa a ação padrão de bloqueio de exclusão. Uma reserva é a única linha que faz referência ao cliente 44. Como o cliente 44 pode ser removido mantendo essa reserva vinculada ao cliente 45, que existe e é válido?
  1. Atualizar a reserva para 45; excluir o cliente 44.
  2. Excluir o cliente 44; atualizar a reserva para 45.
  3. Apagar a chave da reserva; manter o cliente 44 armazenado.
  4. Excluir o cliente 45; atualizar a reserva para 44.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Uma consulta do PostgreSQL para clientes elegíveis retorna os identificadores 31 e 34. Os pedidos de ambos devem ser atualizados. O código usa customer_id = (SELECT id FROM customers WHERE eligible = TRUE). O que acontece e qual comparação corrige o problema?
  1. Atualiza ambos os clientes; manter a igualdade.
  2. Atualiza o primeiro cliente; usar IN.
  3. Apresenta erro por várias linhas; usar IN.
  4. Não atualiza clientes; usar IS NULL.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Os saldos das contas 1 e 2 começam em 300 e 90. Uma transação transfere 40 da conta 1 para a conta 2 e é confirmada. Uma nova transação adiciona 10 à conta 2, define o ponto de salvamento s, adiciona 5 à conta 1, retorna a s e depois executa um rollback completo. Quais saldos permanecem?
  1. 300 e 90, total 390.
  2. 260 e 140, total 400.
  3. 265 e 140, total 405.
  4. 260 e 130, total 390.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Uma transação do PostgreSQL atualiza a linha A, define o ponto de salvamento s e depois falha em uma verificação ao atualizar B. O que pode recuperar a transação mantendo A pendente?
  1. Executar RELEASE s e depois continuar.
  2. Executar ROLLBACK TO s e depois continuar.
  3. Executar COMMIT e depois continuar a transação.
  4. Executar outro UPDATE em B antes de qualquer rollback.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Uma reconstrução no SQLite precisa de uma nova verificação e tem índices dependentes, além de chaves estrangeiras (FKs) ativadas. Qual sequência preserva as regras pretendidas e verifica as referências?
  1. Iniciar; desativar FKs; copiar sem regras; substituir; confirmar; ativar FKs; verificar objetos depois.
  2. Desativar FKs; iniciar; copiar sem regras; substituir; verificar FKs; confirmar; deixar FKs desativadas.
  3. Desativar FKs; iniciar; definir e copiar; substituir; confirmar; verificar FKs; descartar os índices dependentes.
  4. Desativar FKs; iniciar; definir e copiar; substituir e restaurar objetos; verificar FKs; confirmar; ativar FKs.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Uma coluna de estoque do PostgreSQL contém 5, NULL e -2. Ela deve se tornar NOT NULL com CHECK (stock >= 0), mantendo todas as linhas. Contagens ausentes devem se tornar 0, e contagens negativas devem ser corrigidas. Qual sequência estabelece as duas regras?
  1. Definir DEFAULT 0; corrigir -2; adicionar as duas restrições.
  2. Preencher valores NULL com 0; corrigir -2; adicionar as duas restrições.
  3. Preencher valores NULL com 0; manter -2; adicionar as duas restrições.
  4. Preencher valores NULL com 0; corrigir -2; adicionar apenas a verificação.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Travou em uma questão sua? Ajuda com Tarefas

Termos-Chave

70 Termos-Chave, cada um com sua definição

A

ADD COLUMN
A operação ADD COLUMN amplia uma tabela com um novo campo, atribuindo às linhas existentes seu valor padrão ou NULL quando nenhum valor padrão é declarado.
Adicionar active INTEGER NOT NULL DEFAULT 1 atribui o novo valor 1 aos clientes existentes sem inserções separadas.
Afinidade de tipo
A afinidade de tipo é a preferência do SQLite por um tipo de armazenamento para uma coluna, que pode converter entradas adequadas sem rejeitar todos os outros tipos.
Uma coluna inteira comum do SQLite converte '5' em 5, mas pode manter 'abc' como texto sem erro.
ALTER TABLE
A instrução ALTER TABLE altera a definição de uma tabela existente, como suas colunas ou restrições, mantendo suas linhas.
Adicionar um campo de telefone altera a estrutura com ALTER TABLE; preencher os valores de telefone posteriormente usa UPDATE.
Aplicação das restrições de chave estrangeira
A aplicação das restrições de chave estrangeira é a verificação ativa pelo banco de dados das referências e ações declaradas quando linhas relacionadas são inseridas, alteradas ou removidas.
O SQLite precisa de PRAGMA foreign_keys = ON; na conexão antes de uma transação para verificar seus vínculos declarados.
Atomicidade
A atomicidade é a propriedade de tudo ou nada que permite manter ou desfazer alterações relacionadas em uma transação como uma única operação.
Uma transferência concluída deve manter as duas alterações de saldo; manter apenas a retirada comprometeria a operação.
Atribuição em SET
Uma atribuição em SET nomeia uma coluna e seu novo valor ou expressão dentro de UPDATE; vírgulas separam atribuições a várias colunas.
SET in_stock = in_stock - 1 reduz a contagem armazenada, enquanto SET in_stock = 1 a substitui por um.
AUTOINCREMENT
A palavra-chave AUTOINCREMENT do SQLite impede que uma chave primária inteira gerada reutilize números atribuídos a linhas confirmadas, com custo adicional.
Após os identificadores confirmados 1, 2 e 3, excluir 3 ainda faz o próximo identificador gerado por AUTOINCREMENT ser 4.

C

Chave composta
Uma chave composta identifica uma linha pela combinação de valores de várias colunas, sem exigir que cada coluna seja única por si só.
O par de identificadores de pedido e produto identifica um item do pedido, permitindo ambos os valores em outros pares.
Chave estrangeira
Uma chave estrangeira exige que valores filhos não ausentes correspondam a uma chave primária ou única referenciada na tabela pai quando a aplicação das restrições estiver ativada.
Um pedido com identificador de cliente 99 falha quando não existe um cliente 99 e o relacionamento com o cliente é imposto.
Chave natural
Uma chave natural é um valor do mundo real que já identifica um registro e é usado como sua chave em vez de um número artificial.
O ISBN de um livro pode identificar sua edição, enquanto um identificador interno gerado para o livro seria uma chave substituta.
Chave primária
Uma chave primária é uma coluna ou combinação de colunas que identifica uma linha de forma única e deve ter um valor não ausente.
Um identificador de cliente permite que uma atualização selecione um cliente mesmo quando vários têm o mesmo nome.
Chave substituta (chave artificial)
Uma chave substituta é um identificador artificial sem significado descritivo, frequentemente gerado para que detalhes do mundo real possam mudar independentemente.
O identificador gerado de um cliente permanece o mesmo após uma alteração de e-mail, preservando as referências dos pedidos.
CHECK
Uma restrição CHECK testa uma condição em uma linha e rejeita um resultado falso; um resultado desconhecido causado por NULL é aceito.
CHECK (price > 0) rejeita um preço negativo, mas também precisa de NOT NULL quando um preço deve ser fornecido.
Coluna de identidade
Uma coluna de identidade gera valores a partir de uma sequência no PostgreSQL quando uma inserção solicita um valor gerado para essa coluna.
INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY fornece novos identificadores sem um número manual em cada inserção.
COMMIT
O comando COMMIT encerra uma transação tornando suas alterações pendentes permanentes, após o que um rollback posterior não pode desfazer esse trabalho.
Após inspecionar os dois saldos da transferência, a confirmação mantém a retirada e o depósito como uma transferência concluída.
Condição WHERE
Uma condição WHERE testa cada linha para escolhê-la para uma consulta ou gravação; apenas as linhas para as quais a condição é verdadeira são selecionadas.
Uma atualização filtrada pela chave primária do produto alcança no máximo uma linha, mesmo que nomes de produtos se repitam.
Confirmação automática (autocommit)
A confirmação automática confirma cada instrução independente bem-sucedida como sua própria transação, a menos que a sessão tenha aberto uma transação explícita.
Duas atualizações de saldo no modo de confirmação automática podem se tornar permanentes separadamente, deixando uma lacuna se o processo parar.
Confirmação implícita
Uma confirmação implícita torna alterações pendentes permanentes como efeito automático de outra instrução, como uma DDL comum de tabela permanente no MySQL.
A criação de uma tabela no MySQL pode confirmar uma atualização anterior, portanto um rollback posterior não desfaz essa atualização.
CREATE TABLE
A instrução CREATE TABLE cria uma nova tabela com colunas nomeadas, tipos declarados e regras opcionais, inicialmente sem linhas.
CREATE TABLE labels (id INTEGER PRIMARY KEY, name TEXT); prepara uma tabela antes da inserção de rótulos.
CREATE TABLE AS
A instrução CREATE TABLE AS cria uma tabela a partir de resultados de uma consulta, copiando os dados selecionados sem as restrições da origem no SQLite e no PostgreSQL.
Uma cópia cheap_products contém os produtos selecionados quando foi criada, mesmo depois que os preços da origem mudam.

D

Data no formato ISO
Uma data no formato ISO escrita como YYYY-MM-DD coloca o ano primeiro, permitindo que datas em texto formatadas consistentemente sejam ordenadas cronologicamente.
Datas em texto no SQLite, como '2026-03-15', são ordenadas por ano, mês e dia quando todas usam o mesmo formato.
DEFAULT
Um DEFAULT fornece um valor quando uma inserção omite uma coluna; ele não substitui um valor ausente fornecido explicitamente.
Omitir uma coluna de estoque com DEFAULT 0 fornece zero, enquanto informar NULL explicitamente mantém o valor ausente.
DELETE
A instrução DELETE remove linhas inteiras selecionadas por uma condição, ou todas as linhas quando nenhuma condição é fornecida, mantendo a tabela.
Excluir pedidos antigos cancelados mantém os outros pedidos e deixa a tabela pronta para inserções futuras.
Dependência
Uma dependência existe quando um objeto de banco de dados depende da definição de outro objeto, o que pode bloquear a remoção ou alteração desse objeto.
Uma chave estrangeira de pedidos depende de clientes, portanto remover clientes primeiro pode falhar enquanto o vínculo permanecer.
DROP CASCADE
O DROP CASCADE do PostgreSQL remove objetos dependentes junto com o objeto nomeado, incluindo chaves estrangeiras que fazem referência a ele e visões dependentes.
Remover clientes com CASCADE pode deixar os pedidos armazenados, mas remover a chave estrangeira que os vinculava aos clientes.
DROP COLUMN
A operação DROP COLUMN remove uma coluna e seus valores armazenados de uma tabela e pode ser bloqueada por regras ou objetos dependentes.
Remover um campo de celular descarta todos os valores de celular armazenados, mantendo intactos os outros campos dos clientes.
DROP TABLE
A instrução DROP TABLE remove do banco de dados uma tabela com todas as suas linhas e suas próprias restrições, índices e gatilhos.
Após remover a tabela de arquivo, inserir dados nela falha até que uma tabela com esse nome seja criada novamente.

E

Escala
A escala de um tipo decimal é o número de dígitos após a vírgula decimal; o PostgreSQL arredonda os valores armazenados para essa escala.
Uma coluna NUMERIC(8, 2) no PostgreSQL armazena 12,345 como 12,35 porque a escala declarada é dois.
excluded
O nome excluded refere-se à linha proposta para inserção durante uma atualização por conflito no PostgreSQL ou no SQLite, disponibilizando seus valores de entrada.
Para uma entrega, stock.qty + excluded.qty soma a quantidade de entrada proposta à quantidade já armazenada.
Exclusão lógica (soft delete)
Uma exclusão lógica marca uma linha armazenada como removida por meio de um valor, como um registro de data e hora da exclusão, exigindo que consultas de linhas ativas a excluam do resultado.
Definir deleted_at de um cliente mantém a linha, portanto consultas de clientes ativos acrescentam deleted_at IS NULL.

I

Identificador
Um identificador é o nome de um objeto de banco de dados, como uma tabela ou coluna; aspas duplas permitem espaços ou palavras reservadas nele.
O identificador de coluna "order date" precisa de aspas, enquanto order_date evita espaços e é mais fácil de reutilizar.
IF EXISTS
A cláusula IF EXISTS suprime um erro de ausência em uma instrução de remoção, mas ainda remove o objeto nomeado quando ele existe.
DROP TABLE IF EXISTS archived_orders; é bem-sucedido quando a tabela está ausente e a remove quando está presente.
IN
O teste IN verifica se um valor corresponde a um membro de uma lista, incluindo uma lista de chaves retornada por uma consulta SELECT aninhada.
Pedidos de vários clientes da Califórnia podem ser selecionados com identificadores de clientes retornados por uma subconsulta.
Inserção de várias linhas
Uma inserção de várias linhas fornece vários grupos de valores entre parênteses em uma instrução, verificados por inteiro no tratamento comum de restrições.
Três linhas de clientes podem ser adicionadas em uma instrução; uma falha comum de restrição em uma delas rejeita as três.
Inserção ou atualização (upsert)
Uma inserção ou atualização tenta inserir uma linha e pode atualizar uma linha existente quando uma chave ou valor único entra em conflito com os novos dados propostos.
Uma importação de estoque pode adicionar um novo SKU ou atualizar sua contagem com ON CONFLICT (sku) DO UPDATE quando ele já existe.
INSERT
A instrução INSERT adiciona linhas a uma tabela existente usando grupos de valores literais ou resultados de consultas que devem atender às regras do destino.
Uma loja insere um novo produto com seu SKU, nome e preço, deixando o banco de dados gerar seu identificador.
INSERT SELECT
Uma instrução INSERT SELECT copia linhas retornadas por uma consulta para uma tabela existente, associando as colunas selecionadas às colunas de destino pela posição.
A loja visualiza pedidos anteriores a 2026 e depois copia os registros retornados para sua tabela de arquivo já definida.
INTEGER
O tipo INTEGER representa números inteiros, sendo adequado para contagens e valores exatos armazenados como centavos inteiros.
Um valor exato de 19,99 no SQLite pode ser armazenado como 1999 em uma coluna de centavos inteiros para cálculos posteriores.
IS NULL
O teste IS NULL seleciona valores ausentes diretamente, ao contrário da igualdade comum com NULL, que nunca é verdadeira para um valor ausente.
WHERE phone IS NULL encontra clientes sem número de telefone; WHERE phone = NULL não encontra essas linhas.

L

Linguagem de definição de dados (DDL)
A linguagem de definição de dados, ou DDL, é a família de instruções SQL que cria, altera e remove estruturas de bancos de dados.
CREATE TABLE, ALTER TABLE e DROP TABLE alteram a estrutura do banco de dados em etapas diferentes.
Linguagem de manipulação de dados (DML)
A linguagem de manipulação de dados, ou DML, é a família de instruções SQL que adiciona, altera e remove linhas em tabelas existentes.
Adicionar um pedido usa INSERT; corrigir seu status usa UPDATE; remover sua linha usa DELETE.
Lista de colunas
A lista de colunas de uma inserção nomeia explicitamente os campos de destino, determinando como os valores fornecidos são associados a eles pela posição.
Listar (sku, name, price) faz o primeiro valor fornecido ser um SKU, mesmo que price tenha sido declarado antes na tabela.
Literal de texto
Um literal de texto é um texto escrito como valor em SQL usando aspas simples, com apóstrofos internos duplicados para mantê-los dentro do texto.
O literal SQL 'O''Brien' armazena o nome “O'Brien” com um apóstrofo, em vez de encerrar o valor antes da hora.

N

NOT NULL
Uma restrição NOT NULL exige que o valor de uma coluna esteja presente em cada linha, mas aceita texto vazio no SQLite e no PostgreSQL.
Um nome de produto obrigatório omitido de uma inserção causa uma falha quando não tem valor padrão nem valor fornecido.
NULL
NULL é o marcador da SQL para um valor ausente ou desconhecido, distinto tanto do zero numérico quanto de uma cadeia de texto vazia.
Um campo opcional de telefone usa NULL quando nenhum número é conhecido; IS NULL encontra esses clientes.

O

ON DELETE CASCADE
A ação ON DELETE CASCADE exclui automaticamente as linhas filhas que fazem referência à linha pai quando ela é excluída sob uma chave estrangeira aplicada.
Com uma ação em cascata, excluir a cliente Ana remove os pedidos 101 e 102 dela, enquanto o cliente Ben e seu pedido 103 permanecem.
ON DELETE SET NULL
A ação ON DELETE SET NULL mantém as linhas filhas após a exclusão de uma linha pai, mas apaga seus vínculos, exigindo colunas de referência que aceitem valores ausentes.
Quando um fornecedor é removido, os produtos podem permanecer com identificadores de fornecedor ausentes se esse vínculo for opcional.

P

Ponto de salvamento (savepoint)
Um ponto de salvamento é um ponto intermediário nomeado em uma transação que permite desfazer trabalho posterior enquanto alterações pendentes anteriores são mantidas.
Colocar um ponto de salvamento após a primeira atualização permite desfazer a segunda sem perder a primeira.
Ponto flutuante
O ponto flutuante representa números como aproximações binárias, permitindo medições eficientes, mas com possíveis pequenos erros de arredondamento decimal.
O SQLite pode avaliar 0.1 + 0.2 = 0.3 como falso porque seus literais decimais usam armazenamento aproximado.
Precedência de operadores
A precedência de operadores determina quais partes de uma expressão são agrupadas primeiro; a SQL avalia AND antes de OR, a menos que parênteses alterem essa ordem.
Agrupar dois status entre parênteses faz um limite de data comum se aplicar aos dois ramos da condição.
Precisão de NUMERIC
A precisão de NUMERIC é o número total declarado de dígitos decimais, incluindo os anteriores e posteriores à vírgula decimal.
NUMERIC(8, 2) no PostgreSQL permite seis dígitos antes da vírgula decimal e dois depois, até 999.999,99.

Q

Quantidade de linhas afetadas
A quantidade de linhas afetadas informa quantas linhas uma instrução atualizou; SQLite e PostgreSQL incluem linhas correspondentes que receberam seus valores atuais.
Uma atualização que atribui os mesmos valores a três indicadores de atividade existentes ainda pode informar três linhas atualizadas.

R

Reconstrução de tabela
Uma reconstrução de tabela cria uma definição substituta, copia os dados existentes, substitui a tabela antiga e restaura objetos dependentes.
O SQLite pode receber uma nova verificação em uma coluna existente por meio de uma transação que reconstrói a tabela e verifica as linhas copiadas.
RELEASE
O comando RELEASE remove um ponto de salvamento sem desfazer suas alterações posteriores nem confirmar independentemente a transação externa.
Após liberar um ponto de salvamento dentro de BEGIN, um rollback completo ainda pode desfazer o trabalho pendente da transação.
Restrição
Uma restrição é uma regra declarada no banco de dados que verifica dados inseridos ou atualizados e rejeita uma alteração que a violaria.
Uma verificação de preço de produto rejeita um valor negativo independentemente da aplicação que envia a gravação.
Restrição nomeada
Uma restrição nomeada tem um identificador escolhido que ajuda a localizar a regra em mensagens de erro e a fazer referência a ela em alterações posteriores de estrutura.
CONSTRAINT price_positive CHECK (price > 0) dá um nome à regra de preço positivo para manutenção posterior.
RETURNING
Uma cláusula RETURNING faz uma gravação retornar valores escolhidos das linhas afetadas, incluindo identificadores gerados no PostgreSQL e em versões recentes do SQLite.
Uma inserção de pedido pode retornar seu novo identificador para que a próxima inserção vincule itens ao pedido real.
ROLLBACK
O comando ROLLBACK desfaz alterações pendentes na transação atual e a encerra, sem desfazer transações confirmadas anteriormente.
Uma exclusão não confirmada que esvazia a tabela de pedidos pode ser desfeita para restaurar suas linhas originais.
ROLLBACK TO
O comando ROLLBACK TO desfaz alterações feitas após um ponto de salvamento nomeado, deixando a transação externa aberta para mais trabalho ou uma decisão final.
Retornar a um savepoint chamado after_first, definido entre dois aumentos de saldo, desfaz o aumento posterior, mas mantém pendente o anterior.
ROUND
A função ROUND solicita o arredondamento para um número escolhido de casas decimais, sendo útil quando o armazenamento não impõe uma escala decimal.
ROUND(price * 1.10, 2) solicita um resultado com duas casas para um cálculo de preço no SQLite que produziria 21,989.

S

Subconsulta
Uma subconsulta é um SELECT aninhado em outra instrução, que fornece valores ou linhas utilizáveis pela instrução que o contém.
Uma exclusão pode usar order_id IN (SELECT id FROM orders WHERE status = 'cancelled') para escolher itens relacionados.

T

Tabela de preparação (staging)
Uma tabela de preparação contém temporariamente dados importados para que possam ser inspecionados e limpos antes de serem copiados para seu destino final com restrições.
Cadeias de e-mail importadas vazias ou compostas de espaços podem se tornar NULL por meio de NULLIF(TRIM(email), '') durante a consulta de cópia.
Tabela filha
Uma tabela filha contém uma chave estrangeira que aponta para uma tabela pai, vinculando suas linhas a registros referenciados existentes.
A tabela de pedidos é filha da tabela de clientes, enquanto os itens de pedido podem ser filhos dos pedidos.
Tabela pai
Uma tabela pai contém a chave referenciada em um relacionamento de chave estrangeira, portanto suas linhas correspondentes devem existir antes das linhas filhas dependentes.
A tabela de clientes é a tabela pai quando o identificador de cliente de cada pedido faz referência à chave primária do cliente.
Tipo de dados
Um tipo de dados descreve o tipo de valores que uma coluna armazena e ajuda a determinar seu comportamento em comparações, ordenações e operações aritméticas.
Uma quantidade usa um tipo numérico para totais, enquanto um código postal dos EUA usa texto para preservar seus zeros iniciais.
Transação
Uma transação agrupa instruções em uma unidade de trabalho cujas alterações pendentes podem ser mantidas juntas com COMMIT ou desfeitas com ROLLBACK.
Uma transferência coloca sua retirada e seu depósito em uma transação para que uma transferência incompleta possa ser desfeita.
Transação em estado de falha
Uma transação em estado de falha no PostgreSQL resulta de um erro de instrução e recusa comandos comuns até um rollback ou a recuperação para um ponto de salvamento anterior.
Após uma atualização de saldo rejeitada, outro SELECT é recusado até que o estado de falha da transação seja resolvido.
TRUNCATE
A instrução TRUNCATE esvazia uma tabela inteira sem um filtro WHERE nos bancos de dados que oferecem suporte a ela; o SQLite não a fornece.
Uma tabela do PostgreSQL pode ser esvaziada com TRUNCATE TABLE, mas suas regras de dependência e transação continuam importantes.

U

UNIQUE
Uma restrição UNIQUE impede a repetição de valores ou combinações de valores não ausentes, com comportamento para valores ausentes que depende do banco de dados.
UNIQUE (order_id, product_id) permite o mesmo produto em pedidos diferentes, mas rejeita um par repetido.
UPDATE
A instrução UPDATE atribui novos valores a colunas em linhas existentes, escolhendo suas linhas-alvo com uma condição WHERE opcional.
UPDATE products SET price = 22.50 WHERE id = 3; altera um produto sem inserir uma nova linha de produto.

Sobre esta aula

Por StudeliRelatar um erro

Crie seus próprios Materiais de Estudo

Transforme suas anotações, slides e documentos em Guias de Estudo, Questões de Prática, Flashcards e mais 6 ferramentas.

Começar