2012-08-05 2 views
1

테이블 A에는 자동 증가 된 고유 기본 키가 있고 다른 두 테이블 (B 및 C 테이블)에는 외래 키 제약 조건이있는 기본 키가 있습니다. 테이블 기본 키.MySQL 교차 테이블 제약

내가 두 번째와 세 번째 테이블의 모든 행에 대해 그들이 중복을 포함 할 수 있음을 유지하는 제약 조건을 만들고 싶어하고, 테이블 A의 모든 레코드에 대한 그래서 B 또는 C

에 일치하는 레코드가 기본적으로 유형 A의 레코드는 B 또는 C 유형이 될 수 있으며 B 또는 C 중 하나 여야합니다.

MySQL에서 트리거없이이 제약 조건을 제거 할 수 있습니까? 또는 트리거가 필요한가?

도움 주셔서 감사합니다. 그 열을 포함

INSERT INTO Type (type_code) 
VALUES ('B'), ('C') ; 

수퍼 타입 ​​테이블 (: 당신이 필요로하는 다른 하위 테이블 많은 정확히 2 행

CREATE TABLE Type 
    (type_code CHAR(1) NOT NULL 
    , PRIMARY KEY (type_code) 
) ; 

(:

답변

1

당신은 "유형"테이블을 사용할 수 있습니다 "유형"참조) :

CREATE TABLE A 
    (a_id INT NOT NULL AUTO_INCREMENT 
    , type_code CHAR(1) NOT NULL 
    , PRIMARY KEY (a_id) 
    , UNIQUE KEY (type_code, a_id) 
    , FOREIGN KEY (type_code) 
     REFERENCES Type (type_code) 
) ; 

이제는 A 유형 의 기본 키와 type_code : MySQL은 CHECK 제약을 implemeneted 한 경우에만

CREATE TABLE B 
    (a_id INT NOT NULL 
    , type_code CHAR(1) NOT NULL DEFAULT 'B' 
    , PRIMARY KEY (type_code, a_id) 
    , FOREIGN KEY (type_code, a_id) 
     REFERENCES A (type_code, a_id) 
    , CHECK (type_code = 'B') 
) ; 

CREATE TABLE C 
    (a_id INT NOT NULL 
    , type_code CHAR(1) NOT NULL DEFAULT 'C' 
    , PRIMARY KEY (type_code, a_id) 
    , FOREIGN KEY (type_code, a_id) 
     REFERENCES A (type_code, a_id) 
    , CHECK (type_code = 'C') 
) ; 

가 위, 잘 작동합니다. 하지만 그렇지 않습니다. 그래서, 모든 사양이 적용되며, 'B' 유형의 데이터가 C 테이블에 삽입하지 않는 것이 절대적으로 확실하게, 당신은 (CHECK 제약와 MySQL의 쓸모를 제거) 2 개 "유형"테이블을 추가해야합니다 :

INSERT INTO TypeB (type_code) 
VALUES ('B') ; 

INSERT INTO TypeC (type_code) 
VALUES ('C') ; 

및 추가 FKS : 정확히 1 행 각각

CREATE TABLE TypeB 
    (type_code CHAR(1) NOT NULL 
    , PRIMARY KEY (type_code) 
) ; 

CREATE TABLE TypeC 
    (type_code CHAR(1) NOT NULL 
    , PRIMARY KEY (type_code) 
) ; 

이러한 제약으로

ALTER TABLE B 
    ADD FOREIGN KEY (type_code) 
    REFERENCES TypeB (type_code) ; 

ALTER TABLE C 
    ADD FOREIGN KEY (type_code) 
    REFERENCES TypeC (type_code) ; 

, 이브 테이블 A의 행은 B 또는 C 유형 중 하나이며 해당 테이블 (B 또는 C)에 있고 둘 다에 있지 않습니다.

A와 B가 정확히 하나의 테이블에 있어야하며 A와 B 모두에 포함되지 않도록하려면 A에 삽입 할 때주의해야합니다 (모든 삽입은 해당 요구 사항을 적용하는 트랜잭션으로 수행되어야합니다.).

+0

감사합니다. 나는 테이블 A가 테이블 B와 C에 대해 알 필요가 없기 때문에 트리거를 사용했다. 또한 나의 프로시 저는이 제약 조건을 보장하기 위해 트랜잭션을 사용한다. – nikdeapen