「タイプ」テーブルを使用できます:
CREATE TABLE Type
( type_code CHAR(1) NOT NULL
, PRIMARY KEY (type_code)
) ;
正確に2行(必要な数の異なるサブタイプテーブル:
INSERT INTO Type (type_code)
VALUES ('B'), ('C') ;
スーパータイプテーブル(「タイプ」を参照する列を含む):
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の組み合わせを参照しています:
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')
) ;
MySQLのみがCHECK
を実装していれば、上記は問題なく機能します。 制約。しかし、そうではありません。したがって、'B'
ではなく、すべての仕様が適用されていることを絶対に確認してください タイプデータはC
に挿入されます テーブルには、さらに2つの「タイプ」テーブルを追加する必要があります(そして、MySQL CHECK
で役に立たないものを削除します 制約):
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)
) ;
それぞれ正確に1行:
INSERT INTO TypeB (type_code)
VALUES ('B') ;
INSERT INTO TypeC (type_code)
VALUES ('C') ;
および追加のFK:
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)に含まれ、両方に含まれることはありません。
また、それらが正確に1つのテーブルに含まれるようにしたい場合(BにもCにも含まれないようにする場合)、Aに挿入するときに注意する必要があります(すべての挿入は、その要件を適用するトランザクションで実行する必要があります)。