如果您必须在 (t1.id,t2.id) 和 t4.id 之间强制执行一对一的关系,这似乎表明 (t1.id,t2.id) 将是唯一的。
如果是这种情况,如果 (t1.id,t2.id) 在 t3 中应该是唯一的,那么您可以将 PRIMARY KEY 设为 t3。
您可以添加一个对 t4 的外键引用,并使其成为唯一的,这样 t3 中的一行不能与 t4相关联>。或者,你可以让外键引用另一种方式,将t3的主键值存储在t4中。
例如,使t3中的外键为t4
CREATE TABLE t3
( t1_id INT NOT NULL COMMENT 'pk, fk ref t1'
, t2_id INT NOT NULL COMMENT 'pk, fk ref t2'
, t4_id INT COMMENT 'fk ref t4'
, PRIMARY KEY (t1_id,t2_id)
, CONSTRAINT t3_ux2 UNIQUE KEY (t4_id)
, CONSTRAINT fk_t3_t1 FOREIGN KEY (t1_id) REFERENCES t1(id)
ON DELETE CASCADE ON UPDATE CASCADE
, CONSTRAINT fk_t3_t2 FOREIGN KEY (t2_id) REFERENCES t2(id)
ON DELETE CASCADE ON UPDATE CASCADE
, CONSTRAINT fk_t3_t4 FOREIGN KEY (t4_id) REFERENCES t4(id)
ON DELETE RESTRICT ON UPDATE CASCADE
) ...
或者,您可以在 t3 上引入代理主键。 (我们通常只在有其他表具有对 t3 的外键引用时才这样做;因为现在 t3 更像是一个实际实体,而不是纯粹的关系。这避免了我们必须使用复合键作为另一个表中的外键来引用 t3。
例如:
CREATE TABLE t3
( id INT NOT NULL COMMENT 'pk'
, t1_id INT NOT NULL COMMENT 'fk ref t1'
, t2_id INT NOT NULL COMMENT 'fk ref t2'
, PRIMARY KEY (t3_id)
, CONSTRAINT t3_ux1 UNIQUE KEY (t1_id,t2_id)
, CONSTRAINT fk_t3_t1 FOREIGN KEY (t1_id) REFERENCES t1(id)
ON DELETE CASCADE ON UPDATE CASCADE
, CONSTRAINT fk_t3_t2 FOREIGN KEY (t2_id) REFERENCES t2(id)
ON DELETE CASCADE ON UPDATE CASCADE
) ...
您可以在此表 t3 中添加一个外键来引用 t4,如上例所示。
或者您可以实现从 t4 到引用 t3 的关系。
任何一种方式都可以。
我的决定主要基于
1) 避免复合键作为外键(如果没有实体表有复合键)
2) 我们是否想要或需要ON DELETE CASCADE 功能,需要以何种方式工作...从 t3 删除应该级联删除到 t4,或相反。
我在示例中显示了ON DELETE RESTRICT,将t4_id fk 列添加到t3。我认为从 t4 中删除可能不应该通过从 t3 中删除行来“破坏” t1 和 t2 之间的关系kbd>.