我有子表A,需要引用两个不同的表中的任何一个,B和C. B和C相似但需要在不同的表中。
据我了解,mysql只允许FK引用一个表。因此,在查看了其他解决方案之后,我决定在A中创建两个列以引用B或C.因为它应该只是B或C我已经在约束中添加以防止它们都是NOT NULL:
CREATE TABLE conversions
(
id INT AUTO_INCREMENT,
kicker_id INT NOT NULL,
success BOOL NOT NULL,
try_id INT,
penalty_try_id INT,
PRIMARY KEY (id),
FOREIGN KEY (try_id),
FOREIGN KEY (penalty_try_id),
CONSTRAINT conversions_coll_null CHECK (try_id IS NULL OR penalty_try_id IS NULL)
);
这会有用吗?这是一个好的设计吗?
由于
答案 0 :(得分:2)
这是一种很好的方法(假设您添加了外键定义),但有一个重要的警告:MySQL实际上并没有强制执行check
约束。因此,虽然您可以在定义中包含约束,但它不会做任何事情。
如果你想坚持约束,那么你需要使用一个触发器。
顺便说一句,如果您想确保其中一列完全具有值,请使用XOR
而不是OR
。这将表示为:
CHECK (try_id IS NULL XOR penalty_try_id IS NULL)
(当然,这在MySQL中没有做任何事情,但只是为了显示正确的逻辑。)