Anda dapat menggunakan tabel "tipe":
CREATE TABLE Type
( type_code CHAR(1) NOT NULL
, PRIMARY KEY (type_code)
) ;
dengan tepat 2 baris (sebanyak tabel subtipe berbeda yang Anda butuhkan:
INSERT INTO Type (type_code)
VALUES ('B'), ('C') ;
Tabel supertype (yang mencakup kolom yang mereferensikan "Jenis"):
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)
) ;
Tabel subtipe (yang sekarang merujuk pada kombinasi kunci utama A dan kode_tipe:
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')
) ;
Di atas akan berfungsi dengan baik, jika saja MySQL telah mengimplementasikan CHECK
kendala. Tapi belum. Jadi, untuk benar-benar yakin bahwa semua spesifikasi Anda diterapkan, dan bukan 'B'
tipe data dimasukkan dalam C
tabel, Anda harus menambahkan 2 tabel "ketik" lagi (dan menghapus yang tidak berguna di CHECK
MySQL kendala):
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)
) ;
dengan masing-masing tepat 1 baris:
INSERT INTO TypeB (type_code)
VALUES ('B') ;
INSERT INTO TypeC (type_code)
VALUES ('C') ;
dan FK tambahan:
ALTER TABLE B
ADD FOREIGN KEY (type_code)
REFERENCES TypeB (type_code) ;
ALTER TABLE C
ADD FOREIGN KEY (type_code)
REFERENCES TypeC (type_code) ;
Dengan batasan ini, setiap baris tabel A, akan menjadi salah satu dari tipe B atau C dan akan berada di tabel masing-masing (B atau C) dan tidak pernah di keduanya.
Jika Anda juga ingin memastikan bahwa mereka akan berada tepat di satu tabel (dan tidak pernah di B atau C), itu harus diperhatikan saat menyisipkan di A (semua penyisipan harus dilakukan dengan transaksi yang memberlakukan persyaratan itu).