Можете да използвате таблица "тип":
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) и никога в двете.
Ако искате също така да сте сигурни, че те ще бъдат в точно една таблица (и никога нито в B, нито в C), трябва да внимавате, когато вмъквате в A (всички вмъквания трябва да се извършват с транзакция, която налага това изискване).