Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Erro com o trigger do exercício

create table if not exists clientes
(CPF varchar(11) primary key,
Nome varchar (100) not null,
Data_nascimento date null,
Idade int null);

DELIMITER //

CREATE TRIGGER TG_CLIENTES_IDADE_INSERT AFTER INSERT ON CLIENTES
FOR EACH ROW BEGIN
    update clientes set idade = timestampdiff(YEAR, DATA_NASCIMENTO, NOW());
END//

insert into clientes (CPF, NOME, DATA_NASCIMENTO) 
values  ("123", "Fulano de tal", "1995-02-16");

Partindo do código acima (uma simplificação do código do treinamento), e sendo a ideia atualizar as idades da tabela inteira toda vez que um novo cliente for inserido, eu recebo o seguinte erro :

Error Code: 1442. Can't update table 'clientes' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

Eu gostaria de saber porque há esse conflito, se não pode usar o update ou se devo usar ele de forma diferente ou outro comando para a intenção do trigger em questão.

Edit: Após um pouco de pesquisa eu descobri que não se pode usar o update, então usei o new para calcular a idade de todo cliente novo. Porém o old tbm não é permitido num trigger de insert, então eu gostaria de saber se para atualizações ao longo do tempo não teria uma forma de contornar isso. Eu teria que usar em eventos como passagem de tempo ou coisa assim? Assumindo que é possível com MySQL puro.

Como eu faria isso numa situação semelhante para a intenção que eu quero?

Abaixo o código que usei como solução no trigger:

CREATE TRIGGER TG_CALCULA_IDADES_INSERT BEFORE INSERT ON CLIENTES
FOR EACH ROW BEGIN
    set new.idade = timestampdiff(YEAR, new.Data_nascimento, NOW());
END//
1 resposta
solução!

Denilson,

Veja resolve da seguinte forma, alterei a trigger para before, e defini o valor para o campo idade.

`

DELIMITER //

CREATE TRIGGER TG_CLIENTES_IDADE_INSERT BEFORE INSERT ON                                 CLIENTES
FOR EACH ROW BEGIN
    SET NEW.idade = timestampdiff(YEAR, NEW.DATA_NASCIMENTO, NOW() );
END//

`

https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html