I have created two product tables with tbl_produto
and tbl_adiciona
, so instead of every time I want to update inventory, I do not have two equal data in the product table, but in an external table.
<!-- language: lang-sql -->
create table tbl_produto(
cod_produto int not null primary key,
nome_produto varchar(50) not null,
quantidade int not null
);
create table tbl_adiciona(
cod_adiciona int not null primary key auto_increment,
cod_produto int not null,
nome_produto varchar(50),
quantidade int not null
);
alter table tbl_adiciona add constraint fk_codProduto foreign key(cod_produto)
references tbl_produto (cod_produto);
Well, for this I created 2 functions and 1 trigger to help in this process.
delimiter %
CREATE FUNCTION valor()
RETURNS INT
BEGIN
declare ultimoAdc int;
set ultimoAdc = (select a.cod_produto from tbl_adiciona a where a.cod_adiciona =
(select max(cod_adiciona) from tbl_adiciona));
return ultimoAdc;
END%
delimiter $$
CREATE FUNCTION adicionaValor(cod int)
RETURNS int(11)
BEGIN
declare valorAtual int;
declare valorAntigo int;
select quantidade from tbl_produto where cod_produto = cod into valorAtual;
select quantidade from tbl_adiciona where cod_produto = cod and cod_adiciona =
( select cod_adiciona from tbl_adiciona where cod_produto = cod order by
cod_adiciona DESC LIMIT 1) into
valorAntigo;
set @valorTot = valorAtual + valorAntigo;
return @valorTot;
END$$
delimiter ?
create trigger trg_adiciona AFTER INSERT ON tbl_adiciona
for each row
BEGIN
declare cod int;
set cod = valor();
if exists(select cod_produto from tbl_produto where cod_produto = cod) then
update tbl_produto set quantidade = adicionaValor(cod) where cod_produto = cod;
else
insert into tbl_produto(cod_produto,nome_produto,quantidade)
value
(
(select cod_produto from tbl_adiciona a where a.cod_produto = cod),
(select nome_produto from tbl_adiciona a where a.cod_produto = cod),
(select quantidade from tbl_adiciona a where a.cod_produto = cod)
);
end if;
END?
The code works, up to ELSE
. I made this block of code in case I added a non-existent record in the product table, it automatically inserted into the table and caused the next records with the same code to be updated in the product table, not having 2 identical products in the same table ( except the tbl_adiciona
, since it serves as log).
The problem log is:
Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails
('teste'.'tbl_adiciona', CONSTRAINT 'fk_codProduto' FOREIGN KEY ('cod_produto') REFERENCES
'tbl_produto' ('cod_produto'))
How do I solve this problem?
EDIT: Data entered in the table for testing:
insert into tbl_produto(cod_produto,nome_produto,quantidade) values
(1,'Achocolatado',10),
(2,'Maionese',20),
(3,'Leite condensado',30);
insert into tbl_adiciona (cod_produto,nome_produto,quantidade) values
(1,'Achocolatado',20),
(2,'Maionese',10);