Jump to content
bpinto

Apagar registos em varias tabelas

Recommended Posts

bpinto

Boas noites

Gostaria de saber se existe alguma forma de apagar registos em varias tabelas ao mesmo tempo.

A estrutura que tenho criada é a seguinte:

Tabela actividade tem o campo ID_actividade

Tabela actividade/responsavel tem o campo ID_actividade

Tabela actividade/recursos tem o campo ID_actividade

Tabela actividade/destinatarios tem o campo ID_actividade

Tabela actividade/objectivos tem o campo ID_actividade

A minha ideia seria quando apagar o registo na tabela actividade que ele efectua-se o delete em todas as outras tabelas dos registos dessa actividade.

Estive a ler sobre trigger mas não entendi nada do funcionamento.

Não sei se o mesmo pode efectuar vários comandos delete?

Será que me podem dar uma ajuda.

Obrigado

Share this post


Link to post
Share on other sites
bioshock

Eu não tinha conhecimento do trigger, mas pelo que estive a ler parece-me uma excelente opção.

Vê lá este artigo.

Share this post


Link to post
Share on other sites
simonoop

Podes fazer isso de várias formas.

1.Triggers

2.Stored procedures

3.Cascade Delete

4.Lembro-me de uma vez ter visto qualquer coisa envolvendo joins mas não me lembro se era alguém a perguntar se era possível ou se era uma demonstração da coisa. Acho que não é possível mas nunca se sabe.

Eu iria para o stored procedure. Detesto triggers porque é mais uma coisa escondida na base de dados para me esquecer se voltar a revolver a coisa daqui a uns meses. Odeio Cascade Delete pela mesma razão e mais algumas! :P

Share this post


Link to post
Share on other sites
mjamado
1.Triggers

2.Stored procedures

3.Cascade Delete

4.Lembro-me de uma vez ter visto qualquer coisa envolvendo joins mas não me lembro se era alguém a perguntar se era possível ou se era uma demonstração da coisa. Acho que não é possível mas nunca se sabe.

Sim, é possível fazer DELETE com JOIN. Mas se é uma coisa que acontece sempre, eu, na volta, ia para o cascade; claro que isso já devia estar definido à partida, com as relações no sítio.

Mas porque é que não fazes vários DELETE normais no sítio onde o registo é apagado? Ao menos ficava-te sempre in your face sempre que olhasses para essa secção do código, se tiveres medo de te esqueceres do cascade futuramente (mas uns comentários no código e/ou na BD lembrar-te-iam).

UPDATE: Vê lá se isto te funciona (não testado):

DELETE * FROM actividade A
LEFT JOIN actividade_responsavel ARp ON (ARp.ID_actividade = A.ID_actividade)
LEFT JOIN actividade_recursos ARc ON (ARc.ID_actividade = A.ID_actividade)
LEFT JOIN actividade_destinatarios AD ON (AD.ID_actividade = A.ID_actividade)
LEFT JOIN actividade_objectivos AO ON (AO.ID_actividade = A.ID_actividade)
WHERE A.ID_actividade = X


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
ruimcosta

Boas noites

Gostaria de saber se existe alguma forma de apagar registos em varias tabelas ao mesmo tempo.

A estrutura que tenho criada é a seguinte:

Tabela actividade tem o campo ID_actividade

Tabela actividade/responsavel tem o campo ID_actividade

Tabela actividade/recursos tem o campo ID_actividade

Tabela actividade/destinatarios tem o campo ID_actividade

Tabela actividade/objectivos tem o campo ID_actividade

A minha ideia seria quando apagar o registo na tabela actividade que ele efectua-se o delete em todas as outras tabelas dos registos dessa actividade.

Estive a ler sobre trigger mas não entendi nada do funcionamento.

Não sei se o mesmo pode efectuar vários comandos delete?

Será que me podem dar uma ajuda.

Obrigado

Boas Pinto,

Testa o trigger:

drop trigger if exists Actividade_Trigger;

delimiter $$
CREATE TRIGGER Actividade_Trigger AFTER delete ON Actividade
FOR EACH ROW
	BEGIN
		delete from actividade/responsavel where ID_actividade = OLD.ID_actividade;
		delete from actividade/recursos where ID_actividade = OLD.ID_actividade;
		delete from actividade/destinatarios where ID_actividade = OLD.ID_actividade;
		delete from actividade/objectivos where ID_actividade = OLD.ID_actividade;						
	END$$
delimiter ;

Acho que isto deve funcionar. O OLD.ID_actividade é o campo ID na tabela ACTIVIDADES que foi eliminado.

Abraço,


Abraços e beijinhos,Rui Costa

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

×
×
  • Create New...

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.