2011-12-09 2 views
1

MySQL에서 행 제약을 구현할 수 있는지 알고있는 사람이 있습니까?mysql 행 제약을 구현하는 방법

1 : 행 삽입 또는 도착시 업데이트하는 것이 에 어떤 식 으로든 확인을가 있습니까

CREATE TABLE `promotioncodes` (
    `promotionid` int(11) NOT NULL AUTO_INCREMENT, 
    `promotioncode` varchar(30) DEFAULT NULL, 
    `partnerid` int(11) DEFAULT NULL, 
    `value` double DEFAULT NULL, 
    `nr_of_usage` int(11) NOT NULL DEFAULT '0', 
    `valid_from` datetime DEFAULT '0000-00-00 00:00:00', 
    `valid_through` datetime DEFAULT '0000-00-00 00:00:00', 
    PRIMARY KEY (`promotionid`), 
    UNIQUE KEY `promotioncode_unique` (`promotioncode`) 
) 

:

는 인터넷 쇼핑몰에 대한 프로모션 코드를 유지하기 위해 내가 아주 간단한 테이블이 있다고 가정하자) 'valid_from'날짜는 항상 '작고'(날짜 기준) 'valid_through'입니다.

2) 'valid_from'이 비어있는 경우/null 'valid_through'도 공백/null이어야합니다.

3) 'valid_through'가 비어있는 경우/null 'valid_from'도 공백/null이어야합니다.

나는 트리거 및 저장 프로 시저에 관한 몇 가지 내용을 읽었지만 이러한 해결 방법은 없다고 생각합니다. /? 그들이 해결책이라면, 이것을 구현하는 방법에 대한 구체적인 예를 들어주세요.

+0

저장 프로 시저가있을 수도 있지만 약속 할 수는 없습니다. MySQL은 다른보다 견고한 데이터베이스와 같은 부분에서 그렇게 열정적이지 않습니다. – GordonM

답변

1

데이터를 삽입하는 저장 프로 시저를 만들어야합니다. 이 저장 프로 시저에서 필요한 모든 규칙을 구현할 수 있습니다.

다음은 예제입니다.

create procedure promotioncodes_insert(
    IN... list of params 
    OUT error_code 
) 
exec:begin 
    set error_code = 0; -- everything is ok 

    if valid_from > valid_thru then 
    set error_code = -1; -- error 
    leave exec; 
    end if; 

    if (valid_from is null) and (valid_thru is not null) then 
    set error_code = -2; -- another kind of error 
    leave exec; 
    end if; 

    -- and so on 

    -- doing insert 

end; 

insert into promocodes() values()과 같은 직접 삽입을하면 이러한 제약 조건이 작동하지 않습니다.

+0

답장을 보내 주셔서 감사합니다. 하지만 올바른지 이해한다면 이것은 저장된 proc를 통해서만 가능하다. – Marc

+0

올바른 방법입니다. 또한 가짜 열을 테이블에 추가 할 수 있습니다 (fake_status tinyint (1) not null). 제한 사항이있는 삽입/업데이트 트리거를 구현하십시오. 데이터가 제한을 넘어서지 않으면'fake_status = NULL'을 설정하면 데이터가 전혀 삽입되지 않고 내부 애플리케이션을 처리해야한다는 예외가 생깁니다. 그러나 그것은 완전히 사악합니다. – ravnur