是否有必要在外键上定义与主键(父表)上定义的约束相同的约束?

时间:2019-04-16 03:15:44

标签: sql-server

假设我创建了一个表Clients。我定义了一个主键和一组约束,例如:

  • 不为空
  • 长度> 5
  • 大写

以此类推。

现在,我创建另一个表,该表的主键为Clients。 是否应该为外键创建相同的约束?

如果我不这样做,那就没关系,因为该值首先不会存在于主表中:

示例:我没有在外键上创建约束,而是尝试添加一个长度小于5个字符且小写的值...数据库将不在父表上找到该值,因此将不会记录该值,那么在外部表上设置相同约束集的意义何在?

2 个答案:

答案 0 :(得分:0)

至少您应将外键列保持为非空。否则,子表中可能会有许多NULL值。

同样,如@Dale Burrell所述,PRIMARY KEY应该由系统生成,以强制唯一性。如果要在主键列上创建聚簇索引,则该索引应该是狭窄的,递增的,不能为null的唯一值,以获得良好的性能。

答案 1 :(得分:0)

您不需要外键的长度或大写约束。外键约束将对它们进行“隐式检查”(如您所说,因为引用的数据不存在)。

但是对于可空性,这是一个选择。在SQL Server中,如果外键引用表中的一列或多列为NULL,则不会强制执行约束。

因此,这里的问题应该是-另一个表中是否有行应该有效地不引用Clients表中的行?


其他人建议PK应该由系统生成。尽管我同意这样做通常很有用,但不要忘记对实际数据实施约束。例如。即使此列最终不是您的PK,也可能需要对其进行唯一约束,以确保您不会在数据中出现重复项。