Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
diokhan

triggers sql [RESOLVIDO]

Recommended Posts

diokhan

boas,

eu no meu trabalho preciso de utilizar trigger, nunca utilizei antes, tive a estudar com uns tutoriais e a ler informações na Internet sobre trigger, fiz mas ao correr para experimentar não funcionou como deveria. alguém pode ajudar-me a perceber o que fiz de errado?

delimiter ;;

CREATE TRIGGER insertTrigger BEFORE INSERT ON BLAST
    FOR EACH ROW
        INSERT INTO BLAST_INDEX SET ID_BLAST_INDEX = NEW.ID_BLAST AND HIT_DESCRIPTION_INDEX = NEW.HIT_DESCRIPTION AND BLAST_EVALUE_INDEX = NEW.EVALUE;
;; 

----------------- (são script separados)

delimiter ;;

CREATE TRIGGER updateTrigger AFTER UPDATE ON BLAST
FOR EACH ROW 
	UPDATE BLAST_INDEX SET HIT_DESCRIPTION_INDEX = NEW.HIT_DESCRIPTION AND BLAST_EVALUE_INDEX = NEW.EVALUE WHERE ID_BLAST_INDEX = OLD.ID_BLAST;
;;

sempre que insiro um registo na tabela BLAST, na BLAST_INDEX onde supostamente deveria inserir o registo também fica com os campos a NULL e o ID_BLAST_INDEX que deve ser igual ao ID_BLAST fica a 0 :)

e tentei também o UPDATE mas fica na mesma com os campos a NULL e o ID a 0


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
M6

A sintaxe do comando insert standard não é essa, é Insert Into tabela (colunas) values (valores). Não sei se essa sintaxe funciona.

Se os campos ficam NULL é porque os valores originais vão a null. Por exemplo, se tiveres um ID que é auto-incremenado não sei se o mesmo já tem valor atribuído no before insert ou se só tem valor atribuído no after insert.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
diokhan

eu usei a sintaxe como encontrei aqui: http://dev.mysql.com/doc/refman/5.1/en/create-trigger.html

mas vou utilizar a versao standard e já digo algo. obrigado pela dica :)

quanto ao BEFORE E AFTER, como o ID_BLAST é auto incrementado penso que é melhor usar o AFTER, certo?

vou alterar a sintaxe e colocar para AFTER


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
diokhan

troquei isto:

delimiter ;;

CREATE TRIGGER insertTrigger BEFORE INSERT ON BLAST
    FOR EACH ROW
        INSERT INTO BLAST_INDEX SET ID_BLAST_INDEX = NEW.ID_BLAST AND HIT_DESCRIPTION_INDEX = NEW.HIT_DESCRIPTION AND BLAST_EVALUE_INDEX = NEW.EVALUE;
;; 

por isto:

delimiter ;;

CREATE TRIGGER insertTrigger AFTER INSERT ON BLAST
    FOR EACH ROW
        INSERT INTO BLAST_INDEX (ID_BLAST_INDEX, HIT_DESCRIPTION_INDEX, BLAST_EVALUE_INDEX) VALUES (NEW.ID_BLAST, NEW.HIT_DESCRIPTION, NEW.EVALUE);
;; 

e funcionou como deve ser, obrigado pela dica M6 :)

só não percebi o porque de não dar antes, porque estava a seguir o tutorial da pagina do mysql 🤔


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
M6

Não devia estar a dar antes porque o campo era auto-incrementado.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
diokhan

então quando for auto incrementado devo fazer o trigger para AFTER com a sintaxe standard certo? acho que já percebi a lógica :)


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites
M6

Sim é isso.

Os campos auto-increment recebem o valor quando vão ser escritos na tabela, por isso antes de serem escritos não se sabe ainda o valor que vão receber.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
diokhan

obrigado :)

duvida resolvida :D


...Join the dark side...and get a free cookie...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.