Bạn có thể sử dụng bảng "loại":
CREATE TABLE Type
( type_code CHAR(1) NOT NULL
, PRIMARY KEY (type_code)
) ;
với chính xác 2 hàng (bao nhiêu bảng loại phụ khác nhau mà bạn cần:
INSERT INTO Type (type_code)
VALUES ('B'), ('C') ;
Bảng supertype (bao gồm một cột tham chiếu đến "Loại"):
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)
) ;
Các bảng kiểu con (hiện đang tham chiếu đến sự kết hợp của Khóa chính của A và 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')
) ;
Ở trên sẽ hoạt động tốt, chỉ cần MySQL thực hiện CHECK
hạn chế. Nhưng nó đã không. Vì vậy, để hoàn toàn chắc chắn rằng tất cả các thông số kỹ thuật của bạn đều được thực thi, chứ không phải 'B'
dữ liệu kiểu được chèn vào C
bảng, bạn sẽ phải thêm 2 bảng "loại" nữa (và xóa cái vô dụng trong MySQL CHECK
ràng buộc):
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)
) ;
với chính xác 1 hàng mỗi:
INSERT INTO TypeB (type_code)
VALUES ('B') ;
INSERT INTO TypeC (type_code)
VALUES ('C') ;
và các FK bổ sung:
ALTER TABLE B
ADD FOREIGN KEY (type_code)
REFERENCES TypeB (type_code) ;
ALTER TABLE C
ADD FOREIGN KEY (type_code)
REFERENCES TypeC (type_code) ;
Với những ràng buộc này, mọi hàng của bảng A, sẽ thuộc loại B hoặc C và nó sẽ nằm trong bảng tương ứng (B hoặc C) và không bao giờ ở cả hai.
Nếu bạn cũng muốn đảm bảo rằng chúng sẽ nằm trong chính xác một bảng (và không bao giờ nằm trong cả B và C), điều đó nên được cẩn thận khi chèn vào A (tất cả các lần chèn phải được thực hiện với một giao dịch thực thi yêu cầu đó).