Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

MySQL i prosty trigger

45 views
Skip to first unread message

o

unread,
Jun 27, 2010, 11:57:26 AM6/27/10
to
Witam Was,

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.


Mis

unread,
Jun 28, 2010, 5:10:50 AM6/28/10
to
W dniu 2010-06-27 17:57, o pisze:
> Witam Was,
>
> 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,
>


CREATE
TRIGGER ti_osoby
AFTER INSERT ON osoby
FOR EACH ROW
INSERT INTO wybrancy SELECT imie FROM imiona WHERE imie=NEW.imie;


Cezar

unread,
Jun 28, 2010, 6:09:21 AM6/28/10
to

"o" <o...@nospam.pl> wrote in message news:i07sfh$fg8$1...@news.task.gda.pl...
> Witam Was,
>
> 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,
>

a nie lepiej utworzyc VIEW? po co dublowac dane?

c.

o

unread,
Jun 28, 2010, 7:16:45 AM6/28/10
to
Użytkownik "Mis" <a...@a.com> napisał w

> CREATE
> TRIGGER ti_osoby
> AFTER INSERT ON osoby
> FOR EACH ROW
> INSERT INTO wybrancy SELECT imie FROM imiona WHERE imie=NEW.imie;
>

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.


o

unread,
Jun 28, 2010, 7:36:30 AM6/28/10
to
Użytkownik "Cezar" <cez...@BEZtlen.pl>

> a nie lepiej utworzyc VIEW? po co dublowac dane?

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.


Mis

unread,
Jun 28, 2010, 11:06:21 AM6/28/10
to
W dniu 2010-06-28 13:16, o pisze:

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.

Paweł Matejski

unread,
Jun 28, 2010, 4:10:27 PM6/28/10
to
On 28.06.2010 17:06, Mis wrote:
> W dniu 2010-06-28 13:16, o pisze:
>> Użytkownik "Mis"<a...@a.com> napisał w
>>> CREATE
>>> TRIGGER ti_osoby
>>> AFTER INSERT ON osoby
>>> FOR EACH ROW
>>> INSERT INTO wybrancy SELECT imie FROM imiona WHERE imie=NEW.imie;
>>>
>>
>> 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ł?
>>
>
> 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.

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.

0 new messages