2011-02-01 58 views
1

讓我們考慮表mysql的觸發模擬斷言

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

嗯,問題是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之前做到這一點爲好,否則你可能會更新日期爲無效狀態。但除此之外,至少應該讓你開始...