당신은 "유형"테이블을 사용할 수 있습니다 "유형"참조) :
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에 삽입 할 때주의해야합니다 (모든 삽입은 해당 요구 사항을 적용하는 트랜잭션으로 수행되어야합니다.).
감사합니다. 나는 테이블 A가 테이블 B와 C에 대해 알 필요가 없기 때문에 트리거를 사용했다. 또한 나의 프로시 저는이 제약 조건을 보장하기 위해 트랜잭션을 사용한다. – nikdeapen