Oii, Ricardo!
O código da atividade realmente continha equívocos e isso porque no SQLite, não podemos atualizar registros existentes diretamente usando o INSERT INTO
. INSERT INTO
é destinado apenas para inserir novos registros. Para atualizar registros existentes, temos o UPDATE
ou o INSERT OR REPLACE
.
Antes de irmos à solução, deixa-me te dizer o objetivo da instrução, que é objetivo é diminuir a quantidade em estoque de todos os produtos que foram vendidos. Imagine que você vendeu 5 unidades do produto A e 3 unidades do produto B. O que precisamos fazer é atualizar o estoque para refletir essas vendas, diminuindo a quantidade disponível de cada produto.
SOLUÇÃO
INSERT OR REPLACE INTO Estoque (ID_produto, quantidade)
SELECT Vendas.ID_produto, Estoque.quantidade - Vendas.quantidade
FROM Vendas
JOIN Estoque ON Vendas.ID_produto = Estoque.ID_produto;
Neste código, o comando INSERT OR REPLACE INTO Estoque
verifica se o ID_produto
já existe na tabela Estoque
, se existir, ele será substituído pelo novo valor. Se não existir, um novo registro será criado.
Já o SELECT Vendas.ID_produto, Estoque.quantidade - Vendas.quantidade
irá calcular a quantidade restante no estoque após a venda e insere ou substitui o registro com a nova quantidade. Por fim o JOIN
faz o relacionamento entre a tabela Vendas
e a tabela Estoque
com base no ID_produto
.
PARA TESTAR
Separei esse script para caso você queira testar o código no Sqlite Online:
-- Criação da tabela Estoque
CREATE TABLE Estoque (
ID_produto INTEGER PRIMARY KEY,
quantidade INTEGER
);
-- Criação da tabela Vendas
CREATE TABLE Vendas (
ID_venda INTEGER PRIMARY KEY AUTOINCREMENT,
ID_produto INTEGER,
quantidade INTEGER,
FOREIGN KEY (ID_produto) REFERENCES Estoque(ID_produto)
);
-- Inserindo produtos na tabela Estoque
INSERT INTO Estoque (ID_produto, quantidade) VALUES (1, 100);
INSERT INTO Estoque (ID_produto, quantidade) VALUES (2, 200);
INSERT INTO Estoque (ID_produto, quantidade) VALUES (3, 150);
INSERT INTO Estoque (ID_produto, quantidade) VALUES (4, 300);
INSERT INTO Estoque (ID_produto, quantidade) VALUES (5, 50);
INSERT INTO Estoque (ID_produto, quantidade) VALUES (6, 400);
INSERT INTO Estoque (ID_produto, quantidade) VALUES (7, 250);
INSERT INTO Estoque (ID_produto, quantidade) VALUES (8, 600);
INSERT INTO Estoque (ID_produto, quantidade) VALUES (9, 120);
INSERT INTO Estoque (ID_produto, quantidade) VALUES (10, 75);
-- Inserindo vendas na tabela Vendas
INSERT INTO Vendas (ID_produto, quantidade) VALUES (1, 2);
INSERT INTO Vendas (ID_produto, quantidade) VALUES (2, 5);
INSERT INTO Vendas (ID_produto, quantidade) VALUES (3, 1);
INSERT INTO Vendas (ID_produto, quantidade) VALUES (4, 10);
INSERT INTO Vendas (ID_produto, quantidade) VALUES (5, 3);
INSERT INTO Vendas (ID_produto, quantidade) VALUES (6, 8);
INSERT INTO Vendas (ID_produto, quantidade) VALUES (7, 6);
INSERT INTO Vendas (ID_produto, quantidade) VALUES (8, 12);
INSERT INTO Vendas (ID_produto, quantidade) VALUES (9, 4);
INSERT INTO Vendas (ID_produto, quantidade) VALUES (10, 7);
Para verificar os dados da tabela:
SELECT * FROM Vendas
SELECT * FROM Estoque
Agora, ao rodar o comando abaixo o valor de estoque será atualizado. Por exemplo, o ID 1 teve 2 vendas e tinha 100 itens em estoque, ao rodar esse comando, o valor em estoque será atualizado para 98:
INSERT OR REPLACE INTO Estoque (ID_produto, quantidade)
SELECT Vendas.ID_produto, Estoque.quantidade - Vendas.quantidade
FROM Vendas
JOIN Estoque ON Vendas.ID_produto = Estoque.ID_produto;
Obs: O código da atividade foi atualizado.
Espero ter ajudado e qualquer dúvida, conte conosco!
Bons estudos, Ricardo!