2011-02-01 4 views
1

이의 내가 주장을 작성하는 방법이 없습니다 테이블을 mysql을 가진MySQL은 시뮬레이션 주장

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

를 생각해 보자 트리거합니다. 하나 이상의 트리거를 사용하여 다음 어설 션을 시뮬레이션 할 수 있습니까?

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하기 전에이 작업을 수행해야 할 것입니다. 하지만 그렇지 않으면, 적어도 당신을 시작해야합니다 ...