我不太确定你的最终目标是什么。
如果您只是想确保底部表中的 BoxId 和 BallId 必须存在于顶部两个表中,那么您可以使用 FOREIGN KEY(也称为“参照完整性”)。
--- 编辑---
基于其他 cmets/responses,我看到您实际上希望确保通过第三个表连接的 2 行始终具有相同的颜色,但断开连接的行仍然可以具有自己的颜色。
如果是这样,那么您可以像这样“滥用”密钥:
Ball:
BallId PK, AK1
Color AK1
Box:
BoxId PK, AK1
Color AK1
BallInBox
BallId PK
BoxId PK
Color
FK (BallId, Color) references Ball
FK (BoxId, Color) references Box
这是实际的 DDL SQL:
delimiter $$
CREATE TABLE Ball (
BallId varchar(45) NOT NULL,
Color varchar(45),
PRIMARY KEY (BallId),
UNIQUE KEY Ball_AK1 (BallId, Color)
)$$
CREATE TABLE Box (
BoxId varchar(45) NOT NULL,
Color varchar(45),
PRIMARY KEY (BoxId),
UNIQUE KEY Box_AK1 (BoxId, Color)
)$$
CREATE TABLE BallInBox (
BallId varchar(45) NOT NULL,
BoxId varchar(45) NOT NULL,
Color varchar(45),
PRIMARY KEY (BallId, BoxId),
CONSTRAINT BallInBox_FK1 FOREIGN KEY (BallId, Color) REFERENCES Ball (BallId, Color),
CONSTRAINT BallInBox_FK2 FOREIGN KEY (BoxId, Color) REFERENCES Box (BoxId, Color)
)$$
顺便说一句,这允许在“基本”表和“连接”表中使用 NULL 颜色。如果这不是您想要的,添加 NOT NULL 约束很容易。