为什么有必要在数据库中显式指定外键和引用?

时间:2015-05-17 13:40:18

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

您能否解释一下为什么在创建表时需要指定这些外键?  我的意思是,我创建了两个具有一对多关系的表(在ER图上),但我没有指定外键和引用。我可以使用where子句连接表,甚至可以执行连接等。

可能我没有得到一些基本概念,尽管我已经读过一些关于它的东西。我想这与数据一致性或参照完整性等有关。

那么,你能解释一下这些概念吗? 这些引用和外键是绝对必需的,如果我有,比如8-10个具有一对多关系的表,并且我是否可以确保数据正确地插入到数据库中?

3 个答案:

答案 0 :(得分:3)

指定外键关系不是必需。这只是一个好主意。

指定关系时,数据库可确保关系完整性。也就是说,它确保外键列中的值是合法值。

此外,更新或删除值时,外键上的cascade选项会有很大帮助。

答案 1 :(得分:1)

必要的原因是确保data integrity 假设您有一个名为orders的表和一个名为order details的表,它们都有一个名为order id的列。
如果您不使用外键,则可能会为订单表中不存在的订单插入订单详细信息 如果您尝试将订单详细信息添加到非现有订单,则使用外键将使数据库引发错误 如果您删除已有详细信息的订单,它也会引发错误,除非您先删除订单详细信息或在外键上指定cascade delete

答案 2 :(得分:1)

外键约束的驱动程序需要“数据完整性”。 DBMS(数据库服务器软件)可帮助您在指定外键约束时防止任何意外(无意)修改数据。就像你在帮助DBMS帮助你一样。因此,如果您指定约束,例如,当该产品有未完成的product时,可能会阻止意外删除orders

您同意,当您仔细分析约束并在创建数据库(表)时在SQL中指定它们时,它有助于确保完整性。

当您选择保持对实体的了解时,这非常有用。在数据库级别本身。这是一个很好的开始方法,因为你的表(关系)或多或少是自包含的。另一种方法是将所有这些一致性检查的级别高于数据库。例如,这种方法由MVC框架(如 Rails )采用,其中模型是应用约束的层,表本身不需要指定外键和其他约束。

哪种方法更好取决于你的口味,通常,但你应该在他们的精神中使用积木。