ФорумРазработкаБазы данных → Помогите с составлением Триггера Mysql

Помогите с составлением Триггера Mysql

  • onzone

    Сообщения: 77 Репутация: N Группа: Кто попало

    Spritz 14 ноября 2011 г. 22:20

    Здравствуйте, возникла такая проблема. У меня есть рабочий триггер (который позволяет добавлять в базе записи не более 20 раз по определённому ID) на MS SQL

    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    GO
    ALTER trigger [dbo].[insertTrigger] on [dbo][coordinates] for insert
    as
    BEGIN
    declare @count numeric,
    @id numeric,
    @min numeric
    select @id = id from inserted
    select * from coordinates where id = @id
    select @count=@@rowcount
    if @count>=20
    begin
    select @min=min("time") from coordinates where id = @id
    delete from coordinates where id=@id and "time"=@min
    end
    END

    Возникли проблемы при переводе данного триггера в Mysql. Ребята, если, кто знает помогите пожалуйста с составлением данного триггера. Заранее благодарен!
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 14 ноября 2011 г. 23:32, спустя 1 час 12 минут 45 секунд

    нахуй нам надо за тебя работу делать? что ТЫ уже сделал в этой задаче сам?
    Сапожник без сапог
  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz 14 ноября 2011 г. 23:40, спустя 7 минут 43 секунды


    SET DELIMITER $$
    ADD TRIGGER `dbo`.`DBO_COORDINATES_AFTER_INSERT_TRIGGER` AFTER INSERT ON `dbo`.`coordinates`
    FOR EACH ROW
    BEGIN
       SET @count=0;
       SET @min=0;
       SELECT COUNT(*) INTO @count FROM `coordinates` WHERE `id`=NEW.`id`;
       IF @count>=20 BEGIN
           SELECT MIN(`time`) INTO @min FROM `coordinates` WHERE `id`=NEW.`id`;
           DELETE FROM `coordinates` WHERE `id`=NEW.`id` AND `time`=@min;
       END;
    END $$
    SET DELIMITER;

    Не проверял, возможно будет работать, точно не помню, в if begin end разделитель нужно в конец добавлять или нет )
    А удалял я бы не так, а как-нить типа DELETE FROM `coordinates` WHERE `id`=NEW.`id` ORDER BY `time` ASC LIMIT @count-20; тогда не надо вычислять минимум и если уже надобавляли данных больше 20 строк, то до 20 и обрежет.
    Work, buy, consume, die
  • onzone

    Сообщения: 77 Репутация: N Группа: Кто попало

    Spritz 14 ноября 2011 г. 23:58, спустя 17 минут 50 секунд

    phpdude, Написал триггер на SQL=) И день просидел перебирая варианты на Mysql, Nyaah, ага спасибо попробую
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 15 ноября 2011 г. 22:42, спустя 22 часа 44 минуты 10 секунд

    хаха… интересно как именно перебирать варианты )))
  • onzone

    Сообщения: 77 Репутация: N Группа: Кто попало

    Spritz 16 ноября 2011 г. 14:54, спустя 16 часов 12 минут 5 секунд

    kostyl,Ну как пробовали переписать триггер постепенно добавляя функционал, но в итоге чего-то не хочет он работать вот конечный результат такой получили


    delimiter |
    ADD TRIGGER `dbo`.`DBO_COORDINATES_AFTER_INSERT_TRIGGER` AFTER INSERT ON `dbo`.`coordinates`
    FOR EACH ROW
    BEGIN
    SET @count=0;
    SET @min=0;
    SELECT COUNT(*) INTO @count FROM `coordinates` WHERE `id`=NEW.`id`;
    IF @count>=20 BEGIN
    SELECT MIN(`time`) INTO @min FROM `coordinates` WHERE `id`=NEW.`id`;
    DELETE FROM `coordinates` WHERE `id`=NEW.`id` AND `time`=@min;
    END;
    END
    delimiter ;

    Триггер создаёться на mysql , но почему-то не выполняеться, а на ms sql всё работает прекрасно =(
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 16 ноября 2011 г. 14:57, спустя 2 минуты 33 секунды

    Триггер создаёться на mysql , но почему-то не выполняеться

    может хотя бы потмоу что в mysql нет понятия dbo?

    а вы в этом вообще без понятия :-)

    наймите уже кого нить и не клянчите :)
    Сапожник без сапог
  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz 16 ноября 2011 г. 17:39, спустя 2 часа 42 минуты 8 секунд

    delimiter |
    ADD TRIGGER `DBO_COORDINATES_AFTER_INSERT_TRIGGER` AFTER INSERT ON `coordinates`
    FOR EACH ROW
    BEGIN
    DELETE FROM `coordinates` WHERE `id`=NEW.`id` ORDER BY `time` ASC LIMIT 19, 100500;
    END
    delimiter ;
    Спустя 74 сек.
    кстати, если в таблица залочится целиком, а не только создаваемая строка, то триггер не сработает
    Work, buy, consume, die

Пожалуйста, авторизуйтесь, чтобы написать комментарий!