- Aprender
- Computação e TI
- Programação
- Noções básicas de SQL
- Criação de tabelas e alteração de dados
Criação de tabelas e alteração de dados
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
- Escrever instruções
CREATE TABLEque 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 TABLEDefinir 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 colunaEscolher 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.
- Escrever uma instrução CREATE TABLE
- 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 CHECKDeclarar 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 geradosDeclarar 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 estrangeirasDeclarar 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.
- Exigir valores, definir valores padrão e impor limites com NOT NULL, DEFAULT, UNIQUE e CHECK
- 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 VALUESEscrever instruções
INSERT ... VALUEScom uma lista de colunas e textos, números, datas eNULLescritos corretamente, e interpretar os erros que impedem uma inserção. - Inserir dados a partir de consultas, retornar novas chaves e tratar duplicatasCopiar linhas com
INSERT ... SELECT, recuperar valores gerados comRETURNINGe decidir o que acontece quando uma linha inserida entra em conflito com uma existente.
- Inserir linhas com VALUES
- Alterar valores com
UPDATEe remover linhas comDELETE, garantindo que cada instrução afete exatamente as linhas pretendidas.- Alterar valores com UPDATEEscrever instruções
UPDATEque definem uma ou mais colunas, calculam novos valores a partir dos antigos e respeitam as restrições da tabela. - Remover linhas com DELETERemover linhas escolhidas com
DELETE, distinguirDELETE,TRUNCATEeDROP TABLEe decidir quando é melhor marcar uma linha como excluída do que removê-la. - Selecionar exatamente as linhas que você pretende alterar ou removerConstruir condições
WHEREpara alterações que correspondam às linhas pretendidas e a nenhuma outra, e verificar o resultado antes de mantê-lo.
- Alterar valores com UPDATE
- 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çõesIniciar uma transação, manter suas alterações com
COMMITou desfazê-las comROLLBACKe compreender a confirmação automática. - Tratar erros, pontos de salvamento e alterações de estrutura em uma transaçãoResponder 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,ALTEReDROP.
- Confirmar ou desfazer um conjunto de alterações
- 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 TABLEUsar
ALTER TABLEpara adicionar, renomear e remover colunas e alterar tipos e restrições, contornando as limitações do SQLite. - Remover tabelas com DROP TABLERemover tabelas com
DROP TABLE, respeitar as dependências entre tabelas e escolher entre remover a tabela, esvaziá-la e excluir linhas.
- Adicionar, renomear e remover colunas com ALTER TABLE
Guia de estudo de Criação de tabelas e alteração de dados
1Criar 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 productsexibe a instrução de criação. - SQL do SQLite:
PRAGMA table_info(products);lista colunas e tipos. - psql do PostgreSQL:
\d productsmostra 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
| Valores | Tipo útil | Motivo |
|---|---|---|
| Contagens inteiras | INTEGER | Contagens não têm parte fracionária. |
| Valores monetários exatos no PostgreSQL | NUMERIC(p, s) | A aritmética decimal preserva valores exatos. |
| Valores monetários exatos no SQLite | Centavos em INTEGER | Centavos inteiros evitam o armazenamento em ponto flutuante. |
| Medições | REAL ou DOUBLE PRECISION | Valores aproximados são adequados para grandezas medidas. |
| Nomes e códigos | TEXT 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.
2Proteger 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 dados | Declaração de chave primária gerada |
|---|---|
| SQLite | id INTEGER PRIMARY KEY |
| PostgreSQL | id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY |
| MySQL | id INT AUTO_INCREMENT PRIMARY KEY |
| SQL Server | id 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 DELETE | Resultado |
|---|---|
NO ACTION ou RESTRICT | A exclusão falha enquanto 101 e 102 fizerem referência a Ana. |
CASCADE | Ana, 101 e 102 são removidos; Ben e 103 permanecem. |
SET NULL | Ana é removida; todos os pedidos permanecem, com 101 e 102 desvinculados. |
SET DEFAULT | Os 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.
3Adicionar 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
| Tipo | Exemplo SQL |
|---|---|
| Texto | 'Desk lamp' |
| Texto com apóstrofo | 'O''Brien' |
| Número | 1250.50 |
| Data ISO | '2026-03-15' |
| Valor ausente | NULL |
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.
4Alterar 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:
| ID | Status | Data do pedido |
|---|---|---|
| 201 | cancelado | 2025-11-03 |
| 202 | enviado | 2025-12-19 |
| 203 | cancelado | 2026-01-08 |
| 204 | cancelado | 2025-10-30 |
| 205 | expirado | 2026-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ção | Linhas removidas | O que permanece |
|---|---|---|
DELETE ... WHERE ... | Linhas correspondentes | Tabela e outras linhas |
DELETE FROM orders; | Todas as linhas | Tabela vazia |
TRUNCATE TABLE orders; | Todas as linhas, sem WHERE | Tabela vazia |
DROP TABLE orders; | Todas as linhas com a tabela | Nenhuma 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.
5Agrupar 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 dados | Estado após o erro comum de restrição |
|---|---|
| SQLite | A instrução que falhou é desfeita; a alteração anterior de Maya continua pendente. |
| PostgreSQL | A 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.
6Alterar 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:
- Registre os índices, gatilhos e visões que precisam ser recriados. Se as chaves estrangeiras estiverem ativadas, desative-as antes da transação.
- Inicie uma transação e crie uma nova tabela com as regras desejadas.
- Copie as linhas usando colunas explícitas em
INSERT INTO new_products (...) SELECT ... FROM products;. - Remova a tabela antiga e renomeie a nova para
products. - Recrie os objetos dependentes e execute
PRAGMA foreign_key_check;. Resolva quaisquer problemas informados antes de confirmar. - 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 pretendido | Instrução |
|---|---|
| Manter a tabela e remover linhas selecionadas | DELETE FROM orders WHERE ...; |
| Manter uma tabela vazia | DELETE FROM orders; |
| Esvaziar rapidamente uma tabela quando houver suporte | TRUNCATE TABLE orders; |
| Remover a própria tabela | DROP 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
1Criar e inspecionar uma tabela de produtos
11 passos
- 1Introduçã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.
- 2ExplicaçãoLeia uma definição de coluna
Em
name TEXT NOT NULL,nameé o identificador do campo,TEXTdescreve seu armazenamento eNOT NULLexige 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
INSERTposterior fornece essas linhas. - 3ExemploCrie 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.
- 4DicaInspecione a definição real
Use
PRAGMA table_info(products);na SQL do SQLite ou.schema productsem 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. - 5DesafioIsso corrigirá uma tabela antiga?
Uma tabela
productsantiga tem apenasidename. Um script executaCREATE TABLE IF NOT EXISTS products (...)com quatro colunas desejadas. Quantas colunas a tabela existente terá depois?---reveal---
Ela ainda terá duas.
IF NOT EXISTSignora a criação quando o nome está presente. Não compara as definições nem adiciona os campos ausentes. Uma alteração estrutural exigeALTER TABLEou uma reconstrução planejada. - 6Explicaçã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. - 7ExemploLeia 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.
- 8Ideia-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
NUMERICno PostgreSQL para valores decimais exatos. No SQLite, armazene centavos inteiros como inteiros: 1999 representa 19,99. EscreverNUMERIC(8, 2)no SQLite não cria armazenamento decimal exato de escala fixa. Tipos aproximados continuam adequados para medições como temperaturas. - 9DesafioMantenha 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. - 10DesafioVerifique 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 EXISTSpode 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 tabelaSTRICTadequada reforça a aplicação dos tipos. - 11Recapitulaçã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.
2Proteger produtos e vínculos com clientes
13 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoVerifique os dados no banco
- 2ExplicaçãoDê uma função a cada regra
- 3ExemploAcompanhe uma linha aceita
- 4DesafioUm valor padrão corrige um NULL explícito?
- 5Ideia-chaveUm resultado desconhecido passa pela verificação
- 6ExplicaçãoIdentifique a linha inteira
- 7ExemploDeixe o sistema escolher o identificador
- 8DesafioO próximo identificador é uma contagem de linhas?
- 9ExplicaçãoFaça cada pedido encontrar seu cliente
- 10ExemploAcompanhe uma ação em cascata
- 11DesafioMantenha os pedidos após a remoção
- 12DesafioCombine as regras necessárias
- 13RecapitulaçãoVerifique valores, identidade e vínculos
3Inserir produtos e copiar pedidos
11 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoEscolha a origem das novas linhas
- 2ExemploAssocie os campos de um produto
- 3DicaMantenha os valores literais intactos
- 4DesafioLeia a lista explícita
- 5ExplicaçãoAdicione um grupo em uma instrução
- 6ExemploVisualize a consulta de arquivamento
- 7ExemploUse a consulta como entrada
- 8ExplicaçãoIdentifique a linha proposta
- 9DesafioManter ou substituir?
- 10DesafioCopie e vincule sem adivinhar
- 11RecapitulaçãoAcompanhe a entrada durante a gravação
4Alterar exatamente as linhas pretendidas
14 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoSepare o que muda de quais linhas mudam
- 2ExemploAtribua dois novos valores
- 3ExemploAumente um preço a partir do valor antigo
- 4DesafioOs outros preços mudarão?
- 5ExplicaçãoRemova uma linha ou apague um campo
- 6ExemploAcompanhe os pedidos cancelados antigos
- 7DesafioMantenha o histórico de um cliente excluído
- 8DicaReutilize a condição visualizada
- 9ExemploAplique AND antes de OR
- 10DesafioAplique uma regra de data aos dois status
- 11Ideia-chaveUma comparação negativa deixa NULL de fora
- 12DesafioUse uma lista de chaves de clientes
- 13DesafioInspecione uma atualização de todas as linhas
- 14RecapitulaçãoVerifique o significado e o efeito
5Manter ou desfazer uma alteração completa
12 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoUma transferência precisa de duas alterações
- 2ExplicaçãoAbra um limite comum
- 3ExemploSubtraia o valor da transferência
- 4ExemploAdicione e inspecione o depósito
- 5DesafioDesfaça toda a transferência pendente
- 6ExemploAcompanhe uma alteração de saldo que falhou
- 7ExplicaçãoRecupere-se conforme o banco de dados
- 8DesafioEvite manter uma operação incompleta
- 9ExemploMarque um ponto intermediário
- 10Ideia-chaveLiberar não confirma a transação externa
- 11DesafioEssa remoção de tabela pode ser desfeita?
- 12RecapitulaçãoEncerre com uma decisão deliberada
6Alterar ou remover uma tabela com dados
13 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoTrabalhe com registros já presentes
- 2ExemploAdicione um campo que aceite valores ausentes
- 3DesafioTorne um campo obrigatório após preenchê-lo
- 4DicaRenomeie todos os usos externos
- 5ExplicaçãoReconheça um ALTER limitado
- 6ExemploPrepare a substituição
- 7ExemploCopie, substitua e verifique
- 8ExplicaçãoDecida se a tabela deve permanecer
- 9ExemploAcompanhe as dependências no PostgreSQL
- 10DesafioSepare os dois significados de cascata
- 11DicaMantenha dados e definição recuperáveis
- 12DesafioMantenha as regras durante uma reconstrução
- 13RecapitulaçãoAcompanhe a estrutura e suas dependências
Questões de Criação de tabelas e alteração de dados
Conjunto 1: Criar tabelas e fazer as primeiras alterações10 Questões de Prática
Questão 1 de 10
00481. Qual tipo de armazenamento é adequado?Mostrar respostaOcultar resposta
Questão 2 de 10
NUMERIC(6, 2). Qual é seu maior valor positivo?Mostrar respostaOcultar resposta
Questão 3 de 10
qty INTEGER NOT NULL DEFAULT 4 CHECK (qty >= 0). Uma inserção fornece NULL explicitamente para qty. O que acontece?Mostrar respostaOcultar resposta
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
Mostrar respostaOcultar resposta
Questão 5 de 10
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?Mostrar respostaOcultar resposta
Questão 6 de 10
(code, name) com os valores ('R7', 'Notebook'). O que é armazenado em name?Mostrar respostaOcultar resposta
Questão 7 de 10
Mostrar respostaOcultar resposta
Questão 8 de 10
DELETE FROM logs; é executado com sucesso. O que permanece?Mostrar respostaOcultar resposta
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
BEGIN, altera uma quantidade de 8 para 11 e depois executa ROLLBACK. Qual quantidade essa conexão lê em seguida?Mostrar respostaOcultar resposta
Questão 10 de 10
Mostrar respostaOcultar resposta
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
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?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 2 de 10
CREATE TABLE tickets (id INTEGER PRIMARY KEY, label TEXT);. Nenhuma outra instrução é executada. O que existe depois?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 3 de 10
CHECK (score BETWEEN 0 AND 100). Uma inserção fornece NULL. O que acontece?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 4 de 10
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?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 5 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 6 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 7 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 8 de 10
CHECK (balance >= 0). No tratamento comum de restrições, o que COMMIT manteria?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 9 de 10
active INTEGER NOT NULL DEFAULT 1. Qual valor de active suas linhas existentes têm?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 10 de 10
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
NUMERIC(5, 2). O que acontece com um valor inserido de 48,726?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 2 de 10
UNIQUE (room_id, start_time). Ela contém (4, '09:00') e (5, '09:00'). O que acontece quando (4, '10:00') é inserido?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 3 de 10
code TEXT PRIMARY KEY. Qual regra adicional elimina a exceção histórica do SQLite para chaves ausentes?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 4 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 5 de 10
qty INTEGER NOT NULL DEFAULT 6. Qual inserção adiciona uma escova usando esse valor padrão?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 6 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 7 de 10
state = 'closed' OR state = 'expired' AND opened < '2026-01-01'?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 8 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 9 de 10
ROLLBACK TO s e confirma. O que permanece?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 10 de 10
DROP TABLE clients CASCADE; é executado com sucesso. O que pode permanecer de invoices?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
CREATE TABLE t (a INTEGER b TEXT); é executado com sucesso. A inspeção mostra apenas a coluna a. Por quê?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 2 de 10
COUNT(*) retorna?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 3 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 4 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 5 de 10
ON CONFLICT (code) DO UPDATE SET qty = stock.qty + excluded.qty. A mesma instrução é executada novamente. Qual qty é armazenado?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 6 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 7 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 8 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 9 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 10 de 10
CREATE TABLE saved AS SELECT * FROM original;. O que deve ser verificado antes de tratar saved como uma substituta completa?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
value NUMERIC(7, 2). A inserção de 6,789 é bem-sucedida. Qual valor armazenado você deve esperar apenas com base nessa declaração?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 2 de 10
label TEXT NOT NULL, sem outras regras. O que acontece quando o valor fornecido é uma cadeia de caracteres vazia?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 3 de 10
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?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 4 de 10
DO UPDATE SET qty = excluded.qty. Qual quantidade é armazenada após as duas importações e qual total a adição correta teria produzido?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 5 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 6 de 10
customer_id = (SELECT id FROM customers WHERE eligible = TRUE). O que acontece e qual comparação corrige o problema?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 7 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 8 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 9 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 10 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Travou em uma questão sua? Ajuda com Tarefas
Termos-Chave
A
ADD COLUMN
active INTEGER NOT NULL DEFAULT 1 atribui o novo valor 1 aos clientes existentes sem inserções separadas.Afinidade de tipo
'5' em 5, mas pode manter 'abc' como texto sem erro.ALTER TABLE
ALTER TABLE; preencher os valores de telefone posteriormente usa UPDATE.Aplicação das restrições de chave estrangeira
PRAGMA foreign_keys = ON; na conexão antes de uma transação para verificar seus vínculos declarados.Atomicidade
Atribuição em SET
SET in_stock = in_stock - 1 reduz a contagem armazenada, enquanto SET in_stock = 1 a substitui por um.AUTOINCREMENT
C
Chave composta
Chave estrangeira
Chave natural
Chave primária
Chave substituta (chave artificial)
CHECK
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
INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY fornece novos identificadores sem um número manual em cada inserção.COMMIT
Condição WHERE
Confirmação automática (autocommit)
Confirmação implícita
CREATE TABLE
CREATE TABLE labels (id INTEGER PRIMARY KEY, name TEXT); prepara uma tabela antes da inserção de rótulos.CREATE TABLE AS
cheap_products contém os produtos selecionados quando foi criada, mesmo depois que os preços da origem mudam.D
Data no formato ISO
'2026-03-15', são ordenadas por ano, mês e dia quando todas usam o mesmo formato.DEFAULT
DEFAULT 0 fornece zero, enquanto informar NULL explicitamente mantém o valor ausente.DELETE
Dependência
DROP CASCADE
DROP COLUMN
DROP TABLE
E
Escala
NUMERIC(8, 2) no PostgreSQL armazena 12,345 como 12,35 porque a escala declarada é dois.excluded
stock.qty + excluded.qty soma a quantidade de entrada proposta à quantidade já armazenada.Exclusão lógica (soft delete)
deleted_at de um cliente mantém a linha, portanto consultas de clientes ativos acrescentam deleted_at IS NULL.I
Identificador
"order date" precisa de aspas, enquanto order_date evita espaços e é mais fácil de reutilizar.IF EXISTS
DROP TABLE IF EXISTS archived_orders; é bem-sucedido quando a tabela está ausente e a remove quando está presente.IN
Inserção de várias linhas
Inserção ou atualização (upsert)
ON CONFLICT (sku) DO UPDATE quando ele já existe.INSERT
INSERT SELECT
INTEGER
IS NULL
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)
CREATE TABLE, ALTER TABLE e DROP TABLE alteram a estrutura do banco de dados em etapas diferentes.Linguagem de manipulação de dados (DML)
INSERT; corrigir seu status usa UPDATE; remover sua linha usa DELETE.Lista de colunas
(sku, name, price) faz o primeiro valor fornecido ser um SKU, mesmo que price tenha sido declarado antes na tabela.Literal de texto
'O''Brien' armazena o nome “O'Brien” com um apóstrofo, em vez de encerrar o valor antes da hora.N
NOT NULL
NULL
NULL quando nenhum número é conhecido; IS NULL encontra esses clientes.O
ON DELETE CASCADE
ON DELETE SET NULL
P
Ponto de salvamento (savepoint)
Ponto flutuante
0.1 + 0.2 = 0.3 como falso porque seus literais decimais usam armazenamento aproximado.Precedência de operadores
Precisão de NUMERIC
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
R
Reconstrução de tabela
RELEASE
Restrição
Restrição nomeada
CONSTRAINT price_positive CHECK (price > 0) dá um nome à regra de preço positivo para manutenção posterior.RETURNING
ROLLBACK
ROLLBACK TO
after_first, definido entre dois aumentos de saldo, desfaz o aumento posterior, mas mantém pendente o anterior.ROUND
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
order_id IN (SELECT id FROM orders WHERE status = 'cancelled') para escolher itens relacionados.T
Tabela de preparação (staging)
NULL por meio de NULLIF(TRIM(email), '') durante a consulta de cópia.Tabela filha
Tabela pai
Tipo de dados
Transação
Transação em estado de falha
TRUNCATE
TRUNCATE TABLE, mas suas regras de dependência e transação continuam importantes.U
UNIQUE
UNIQUE (order_id, product_id) permite o mesmo produto em pedidos diferentes, mas rejeita um par repetido.UPDATE
UPDATE products SET price = 22.50 WHERE id = 3; altera um produto sem inserir uma nova linha de produto.- 1Modelo relacional
- 2Consultas com SELECT
- 3Colunas calculadas e funções em SQL
- 4Agregação e agrupamento em SQL
- 5Junções SQL
- 6Criação de tabelas e alteração de dados
Sobre esta aula
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.