Pegar resultdo do select dentro do trigger

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!

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

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

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; 

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

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.

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!

É 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!!!

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

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.