ne kontam kakve sad veze ova procedura ima sa trigerom i dve tabele :)
copy paste te procedure ovde + dodaj "izmisljenom" sintaksom to sto hoces pa da vidimo dal mozes ...
ne znam zasto bi radio select u kursor da bi to doda u u t3 kad mozes direkt ..
Code:
insert into t3 (a, b, c, d) (select t1.a, t1.b, t2.x, t2.y from t1,t2 where t1.id = t2.id);
e sad, sta znaci "sto ne postoji u t3" ... oces sve iz t1*t2 gde t1.id=t2.id not in (select id from t3)?
Code:
insert into t3 (a, b, c, d) (select t1.a, t1.b, t2.x, t2.y from t1,t2 where t1.id = t2.id and t1.id not in (select id from t3) );
pretpostavljam da pokusavas da izvedes ono sto smo pricali oko materialized view-a odnosto "cache" tabele uz pomoc trigera ... sta je fora .. ne mozes da ides na varijantu da imas "sadasnje stanje" i onda iz "sadasnjeg stanja" gde je ta tabela prazna a tabele t1 i t2 od kojih treba da nastane imaju slogove ... moras da ides na varijantu da trigeri postoje "od pocetka" te da je sve vreme ta tabela up2date ... eventualno mozes da napravis skript/proceduru koji ce da rekreiraju tu tabelu (za prvi put ili za kasnije ako je potrebno)... tako da ako su ti trigeri tu od pocetka i ako su napisani kako treba nikada neces imati situaciju da dodajes one koje "(ne)postoje" ....
na primer ..
Code:
create table t1 (id int auto_increment primary key, a int, b int) engine=innodb;
create table t2 (a int, x int) engine=innodb;
create table tmp1 (id int primary key, a int, b int, sx int) engine=innodb;
-- select t1.id, t2.a, t1.b, sum(t2.x) from t1,t2 where t1.id=t2.id group by t2.a;
DELIMITER $$
DROP TRIGGER IF EXISTS `tr1`$$
CREATE DEFINER = 'root'@'localhost' TRIGGER `tr1`
AFTER INSERT ON `t1`
FOR EACH ROW BEGIN
insert into tmp1 (id,a,b,sx) values(NEW.id,NEW.a,NEW.b, (select sum(x) from t2 where a=NEW.a) );
END;
$$
DROP TRIGGER IF EXISTS `tr2`$$
CREATE DEFINER = 'root'@'localhost' TRIGGER `tr2`
AFTER UPDATE ON `t1`
FOR EACH ROW BEGIN
-- ovde bi trebao jedan if new.id <> old.id al nema veze
update tmp1 set id = NEW.id WHERE id = OLD.id;
-- ovde bi trebao jedan if new.a <> old.a al nema veze
update tmp1 set sx = (select sum(x) from t2 where a=NEW.a) where id=NEW.id;
END;
$$
DROP TRIGGER IF EXISTS `tr3`$$
CREATE DEFINER = 'root'@'localhost' TRIGGER `tr3`
AFTER INSERT ON `t2`
FOR EACH ROW BEGIN
update tmp1 set sx = (select sum(t2.x) from t2 where t2.a=tmp1.a) WHERE tmp1.a = NEW.a;
END;
$$
DROP TRIGGER IF EXISTS `tr4`$$
CREATE DEFINER = 'root'@'localhost' TRIGGER `tr4`
AFTER UPDATE ON `t2`
FOR EACH ROW BEGIN
update tmp1 set sx = (select sum(t2.x) from t2 where t2.a=tmp1.a) where tmp1.a in ( NEW.a, ILD.a);
END;
$$
DELIMITER ;
(malopre sam se probudio tako da, mozda sam tu i tamo nesto omasio ali generalno je to princip ... moze to da se optimizuje, posebno za neki realan slucaj)