2

내 테이블은 두 개의 열로 구성됩니다. A와 B는 둘 다 nullable이며 다른 테이블의 외래 키입니다. A 또는 B 중 적어도 하나가 null이 아니어야한다는 제약 조건을 어떻게 부과 할 수 있습니까?MySQL : 두 필드 중 적어도 하나에 대한 제약

+0

MySQL은 검사 제약 조건을 전혀 지원하지 않습니다. [문서에서] (http://dev.mysql.com/doc/refman/5.1/en/create-table.html) "CHECK 절은 구문 분석되지만 모든 저장소 엔진에서 무시됩니다." – Andomar

+0

답변을 삭제 했으므로 MySQL을 사용하고 있다는 것을 깨닫지 못했습니다. – ClaireG

+0

외래 키인 경우 nullable 기본 키가있는 다른 테이블이 있음을 의미합니까? 그건 맞지 않아. –

답변

0

가능한 답변 : 더 나은 솔루션이있는 경우 의견을 주시기 바랍니다.

롤랜드 보먼의 this 솔루션을 찾았습니다.

delimiter go 

create procedure validateAtLeastOneValue(
    in a bigint(16), in b bigint(16) 
) 
deterministic 
no sql 
_main: begin 
    declare err_no value_specified condition for sqlstate '45000'; 

    if a is not null then 
     leave _main; -- nothing to validate 
    end if; 
    if b is not null then 
     leave _main; -- nothing to validate 
    end if; 
    signal err_no_value_specified -- raise an error 
    set message_text = 'No value specified'; 
end; 
go 

delimiter ; 

지금 테이블에 삽입 (또는 갱신)에 대한 이벤트 핸들러에서이 프로 시저를 호출 : 자신의 솔루션의 정신을 바탕으로, 여기에 내가 가진 것입니다.

create trigger on_before_insert 
before insert on mytable 
for each row 
begin 
    call validateAtLeastOneType(
     NEW.a 
    , NEW.b 
    ); 
end; 

create trigger on_before_update 
before update on mytable 
for each row 
begin 
    call validateAtLeastOneType(
     NEW.a 
    , NEW.b 
    ); 
end; 
0

당신은 A와 B가 null는 아니고, 할 수 있습니다 (하지만 제로는 괜찮습니다) 두 열에 고유 키를 추가

ALTER TABLE TableName 
ADD CONSTRAINT AB UNIQUE (A,B) 
+0

하지만 A B의 조합은 독창성을 부여 할 것입니다. 맞습니까? 그건 내가 원하는 것이 아니다. – Neel

+1

여러 레코드에서 같은 조합을 사용하려는 경우 맞지 않습니다. – Pierre

관련 문제