Pegar resultdo do select dentro do trigger

9 respostas
M

Olá,

Pretendo que toda vez que inserir uma informação na tabela, ele verifique nos registros se já existe um valor igual ao do insert e altere ele.

Para isso tentei fazer um TRIGGER, mas não consigo informar ao UPDATE o código do registro para ele alterar.

CREATE TRIGGER remove_posicao 

BEFORE INSERT ON news

FOR EACH ROW 

BEGIN

//aqui eu procuro saber se o valor do campo passado pelo INSERT já existe.

IF EXISTS(select cod_noticias, posicao from news where posicao = NEW.posicao)

THEN

//não consigo pegar o valor da select acima para fazer update em determinado registro.

UPDATE news SET posicao = '5' where cod_noticias = ??????????

END

Obrigado!

9 Respostas

J

Já tentou algo assim:

CREATE TRIGGER remove_posicao BEFORE INSERT ON news FOR EACH ROW BEGIN UPDATE news SET posicao = '5' where cod_noticias = (select cod_noticias from news where posicao = NEW.posicao) END

M

Não rodou não, deu o erro:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘END’ at line 9

A

Eu acho que isso funciona, cria uma variável e usa a palavrinha máqica INTO.

select cod_noticias into sua_variavel_criado_no_codigo from news where posicao = NEW.posicao;
UPDATE news SET posicao = '5' where cod_noticias = sua_variavel_criado_no_codigo;
M

Deu erro de novo…

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INTO cod_noti from news where posicao = NEW.posicao)

THEN  
' at line 11
M

Eu consegui eliminar os erros, mas ele não está modificando a posicao não, é como se o comando update estivesse lá mas não funciona.

BEGIN  
    DECLARE cod_noti INT DEFAULT 0;  
    DECLARE po INT DEFAULT 0; 
    SET po = 5; 
    
    select cod_noticias INTO cod_noti from news where posicao = NEW.posicao;
      
    IF cod_noti = NEW.posicao
    THEN
    UPDATE news SET posicao = po where cod_noticias = cod_noti;  
    END IF;
    END

Ainda não consegui.

J

mdbatera,

Andei pesquisando e descobri que o MySQL tem a limitação de não permitir que você faça comandos de atualização na mesma tabela do próprio trigger…

Dá uma olhada nestes links:
http://www.guj.com.br/java/211954-trigger-mysql—erro-1442
http://www.scriptbrasil.com.br/forum/lofiversion/index.php/t143829.html
http://mark.koli.ch/2009/07/mysql-trigger-error-1442-hy000-cant-update-table-tbl-in-stored-functiontrigger-because-it-is-al.html

O único que diz ter solução não resolve o teu problema, você quer atualizar as outras linhas, e não a que está sendo inserida (se entendi corretamente)
http://hengrui-li.blogspot.com/2009/11/solution-for-cant-update-table-in.html

Só para constar, cheguei ao mesmo erro 1442 com o seguinte trigger:

CREATE TRIGGER remove_posicao BEFORE INSERT ON news FOR EACH ROW BEGIN UPDATE news SET posicao = '5' where posicao = new.posicao ; END
Eu não conhecia essa limitação do MySQL!
Se descobrir uma solução conte pra nós!

Boa sorte!

M

É jamirdeajr ,

Realmente parece que não tem jeito mesmo!

Pensei em usar o Postgres, mas não gosto muito.

Vou ter que implementar no php mesmo.

Mas se eu souber de algo eu coloco aqui.

Valeu Mesmo!!!

V

Ao postar tópicos ou títulos de tópicos, por favor, DESLIGUE O CAPS LOCK.

G

No MS SQL Server vc tem as tabelas INSERTED e DELETED, uso as duas para pegar valores que estão sendo inseridos ou atualizados, verifique se no MYSQL tem alguma coisa do genêro, espero ter ajudado.

 ==============================================================================

 Se for INSERT

 ==============================================================================	

IF EXISTS (SELECT * FROM INSERTED) AND NOT EXISTS (SELECT * FROM DELETED)

BEGIN

SET @VARIAVEL = (SELECT VARIAVEL FROM INSERTED);

END

OBS.: CapsLock usado por ser mais legivel para o SGDB.
by DBA.

Criado 6 de dezembro de 2011
Ultima resposta 16 de dez. de 2011
Respostas 9
Participantes 5