|
MySQL.RU - Webboard
Вернуться
Тригеры (sergej) 06/01/2008 - 15:45:24
Re: Тригеры (vi.k) 09/01/2008 - 06:24:39
Re: Тригеры (sergej) 10/01/2008 - 12:15:21
Re: Тригеры (vi.k) 11/01/2008 - 04:55:59
Re: Тригеры (sergej) 11/01/2008 - 12:22:12
Re: Тригеры (vi.k) 15/01/2008 - 02:54:20
Re: Тригеры (vi.k) 15/01/2008 - 03:18:51
Re: Тригеры (vi.k) 15/01/2008 - 04:04:14
> Original message text:
> From: sergej - 06/01/2008 - 15:45:24
> Subject:Тригеры
> -----------------
> Как переделать эти тригеры на mysql
> CREATE TABLE SERVICE (
> ID INTEGER NOT NULL,
> PARENT INTEGER NOT NULL,
> NAME VARCHAR(30) CHARACTER SET WIN1251 COLLATE WIN1251,
> CCOUNT INTEGER DEFAULT 0);
>
>
> ALTER TABLE SERVICE ADD CONSTRAINT PK_OBJECTS PRIMARY KEY (ID);
>
>
> SET TERM ^ ;
>
> CREATE TRIGGER TBD_SERVICE FOR SERVICE
> ACTIVE BEFORE DELETE
> POSITION 0
> AS
> BEGIN
> UPDATE SERVICE O
> SET O.CCOUNT = O.CCOUNT - 1
> WHERE O.ID = old.PARENT;
> END^
>
> CREATE TRIGGER TBI_SERVICE FOR SERVICE
> ACTIVE BEFORE INSERT
> POSITION 0
> AS
> BEGIN
> UPDATE SERVICE O
> SET O.CCOUNT = O.CCOUNT + 1
> WHERE ID = new.PARENT;
> END^
>
> CREATE TRIGGER TBU_SERVICE FOR SERVICE
> ACTIVE BEFORE UPDATE
> POSITION 0
> AS
> BEGIN
> if (old.PARENT <> new.PARENT) then
> begin
> UPDATE SERVICE O SET O.CCOUNT = O.CCOUNT - 1
> WHERE O.ID = old.PARENT;
> UPDATE SERVICE O SET O.CCOUNT = O.CCOUNT + 1
> WHERE O.ID = new.PARENT;
> end
> END^
> SET TERM ; ^
>
From: vi.k - 15/01/2008 - 04:04:14
Subject:Тригеры
-----------------
Н-да, сам посмотрел, что предложил :)
Варианты:
1. Не использовать триггеры, делать UPDATE вручную на клиенте
2. Не хранить и не пересчитывать ccount в таблице, а каждый раз считать самостоятельно.
Кол-во для одного parent'а:
SELECT COUNT(*) ccount FROM service WHERE parent=1;
Вся информация вместе с количеством для одного parent'а:
SELECT id, parent, cc.ccount, name FROM
( SELECT COUNT(*) ccount FROM service WHERE parent=1) AS cc
JOIN service ON service.id=1;
Вся информация вместе с количеством по всем записям:
SELECT service.*, IFNULL(cc.ccount,0) ccount FROM
service LEFT JOIN
( SELECT parent, COUNT(*) ccount FROM service GROUP BY parent) AS cc
ON service.id=cc.parent;
Скорость выполнения нормальная - тормозов не будет.
P.S. Понимаю, что вы и сами могли всё это придумать. Но так уж мне захотелось чего-нибудь придумать :)
[Это сообщение - спам!]
Последние сообщения из форума
Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL,
версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
32773
|
|