MySQL外键还是没有?

时间:2014-08-08 14:36:20

标签: mysql sql foreign-keys foreign-key-relationship

我有以下三个MySQL表,我想知道一个字段是否是外键。

当用户从 tests 表中完成测试时,会在 scores 表中插入一行,其中 test_id 等于 tests 表中的test_id

但是,用户可以完成不是来自 tests 表的计算机自动生成的测试,当发生这种情况时, test_id 等于'0 '未出现在 tests 表中。

这意味着 test_id 不是得分表中的外键,对吗?

scores:
score_id(PK, AI), test_id(FK?), module_id(FK)...

tests:
test_id(PK, AI), module_id(FK), user_id(PK), name...

modules:
module_id(PK, AI), name....

2 个答案:

答案 0 :(得分:1)

在我看来,您应该将列作为tests表的外键。然后你有几个选择:

  1. 您可以在tests表中为假劣的"计算机生成的"试验。这可能是0的值,您现在拥有相同的数据结构。

  2. 您可以使用TestType列来区分不同的测试。对于实例,可能需要值'Real''Computer-Generated'。然后,您将与tests表具有外键关系。当测试类型不是正确的类型时,它将是NULL

  3. 您可以在(2)上进行快捷方式,只考虑计算机生成的NULL值。

  4. 我对你的申请知之甚少,但我会亲自去找(1)或(2)。

答案 1 :(得分:0)

这取决于分数和测试之间的关系。

如果某些分数的test_id为'0',则很可能是因为它们没有test表的外键。除非另有说明,否则这不是必需的。

这是可能的,因为单个分数可能与测试表中列出的任何测试没有关系。

某些数据库会将这些值列为NULL,而其他数据库则会列为“0”

编辑:

另外(鉴于您的附加评论),这不是外键。请参阅维基百科的以下评论

  

大多数数据库管理系统都提供了确保这一点的机制   每个非null外键对应于引用的一行   表

因此,在关系数据库中,如果它强制执行参照完整性约束,则不会是外键