MySQL триггеры, имитирующие утверждения - PullRequest
1 голос
/ 01 февраля 2011

Давайте рассмотрим таблицу

Video(
    IDvideo(PK),
    Date,
    Description,
    User
)

с mysql. У меня нет возможности писать утверждения.Можно ли смоделировать следующее утверждение, используя один или несколько триггеров?

create assertion asser1  
check (0 = 
    ( select count(*)  
      from Video  
      where Date >= DATE_SUB(current_date(),INTERVAL  1 YEAR ) 
          && Date<=current_date()  
      group by User   
      having count(*) > 200
    )
)

как мне написать этот триггер?

1 Ответ

1 голос
/ 01 февраля 2011

Ну, проблема в том, что MySQL не имеет эквивалента команды STOP ACTION. В общем, обходные пути довольно грязные:

Одним из способов является то, что вы можете нарушить ограничение внутри триггера, чтобы вызвать ошибку и отменить вставку:

CREATE TABLE stop_action (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(35),
    UNIQUE KEY (id, name)
);
INSERT INTO stop_action (1, 'Assert Failure');

Затем в триггере просто попробуйте:

INSERT INTO stop_action (1, 'Assert Failure');

Преимущество этого заключается в том, что возвращаемая ошибка будет являться ошибкой дубликата ключа, а текст будет содержать "Ошибка подтверждения".

Итак, ваш триггер станет:

delimiter |

CREATE TRIGGER asser1_before BEFORE INSERT ON test1
  FOR EACH ROW BEGIN
    SELECT count(*) INTO test FROM (select count(*)
          from Video  
          where Date >= DATE_SUB(current_date(),INTERVAL  1 YEAR ) 
            && Date<=current_date()  
          group by User   
          having count(*) > 200);
    IF test != 0 THEN
        INSERT INTO stop_action (1, 'Assert Failure');
    END IF;
  END;
|

delimiter ;

Теперь вам нужно сделать это и до UPDATE, иначе вы можете обновить дату до недопустимого состояния. Но в противном случае это должно, по крайней мере, помочь вам начать ...

...