Mam prosty problem w MySQL kt�rego nie potrafi�
rozwi�za� chocia� pr�bowa�em na wszystkie sposoby.
Chodzi o triggera kopiuj�cego dane pod pewnym warunkiem.
S� np. trzy tablice z nast�puj�cymi kolumnami:
tablica: osoby: imi�, nazwisko
tablica: imiona: imi�
tablica: wybra�cy: imi�
Je�eli do tablicy 'osoby' wstawiany jest nowy wiersz,
to wstawione 'imi�' ma by� r�wnie� wstawione do tablicy
'wybra�cy' pod warunkiem, �e wyst�puje w tablicy 'imiona'.
Zrobi�em wiec triggera after insert na tablicy 'osoby' ale
potrafi� tylko kopiowa� wszystkie insertowane dane do
tablicy 'wybra�cy'. Gdy pr�bowa�em z warunkiem to nigdy
nie dzia�a�o... W rzeczywisto�ci to s� du�o szersze tablice,
z rekordami rz�du kilku milion�w.
By�bym bardzo wdzi�czny gdyby kto� da� rad� podsun��
rozwi�zanie... Pozdrawiam,
o.
CREATE
TRIGGER ti_osoby
AFTER INSERT ON osoby
FOR EACH ROW
INSERT INTO wybrancy SELECT imie FROM imiona WHERE imie=NEW.imie;
a nie lepiej utworzyc VIEW? po co dublowac dane?
c.
Też tak robiłem, ale po utworzeniu triggera do tablicy z której dane sa
kopiowane
przestaja splywać dane, tak jakby się blokowala, natomiast trigger nic nie
wstawia.
Po pewnym czasie trigger sam po prostu znika z bazy jakby coś go dropnęło.
W rzeczywistości w moim warunku wstawiajcym dane przez trigger jest
sprawdzanie
poprzez exists danych w tablicy w innej bazie.
Macie jakiś pomysł?
o.
Mam juz taki widok. Musi dokonywać zlaczenia
analizujac kilkanascie czynnikow, a danych jest
bardzo duzo wiec dziala bardzo wolno (mam indeksy
jak sadze uzyteczne). Uznalem ze moge juz na
etapie wstawiania danych odseparowac te ktore
spelniaja okreslone warunki i wybrane kolumny
przenosic do osobnej tablicy. W tej osobnej
tablicy danych byloby znacznie mniej i wszystkie
spelnialyby okreslone warunki wiec pobierajac z
niej dane nie musiałbym niczego laczyc miedzy
bazami/tablicami i moze byloby szybciej. Tak mi
sie przynajmniej wydaje ;)
o.
A to dziwne - sprawdziłem i u mnie działa. Masz oczywiscie indeks na
imie w imiona? Ale to i tak bez znaczenia, bo to powinno chodzic.
Najwyzej przeciagal by sie zapis do osoby. Moze jest jakas niespojnosc w
bazie np. po awarii zasilania. Zobacz na bledy, ostrzezenia i deadlocki.
CREATE TABLE `imiona` (
`imie` varchar(45) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `wybrancy` (
`imie` varchar(45) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `osoby` (
`imie` varchar(45) DEFAULT NULL,
`nazwisko` varchar(45) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE
TRIGGER `ti_osoby`
AFTER INSERT ON `osoby`
FOR EACH ROW
INSERT IGNORE INTO wybrancy SELECT imie FROM imiona WHERE imie=NEW.imie;
I działa!
Inna sprawa, ze takie zależności powinno się załatwiać kluczami ale
zakładam, ze masz powody żeby to robić tak a nie inaczej.
Problem w tym, że on nie ma takiego układu tabel. On go wymyślił, żeby niby uprościć problem do przedstawienia. A
zapewne błąd ma gdzieś w zapytaniu, pewnie zapomniał jakiegoś złączenia albo coś podobnego.
Wkleił by kod tego swojego triggera i by było wiadomo o czym rozmawiamy.
--
P.M.