您能否解释一下为什么在创建表时需要指定这些外键? 我的意思是,我创建了两个具有一对多关系的表(在ER图上),但我没有指定外键和引用。我可以使用where子句连接表,甚至可以执行连接等。
可能我没有得到一些基本概念,尽管我已经读过一些关于它的东西。我想这与数据一致性或参照完整性等有关。
那么,你能解释一下这些概念吗? 这些引用和外键是绝对必需的,如果我有,比如8-10个具有一对多关系的表,并且我是否可以确保数据正确地插入到数据库中?
答案 0 :(得分:3)
指定外键关系不是必需。这只是一个好主意。
指定关系时,数据库可确保关系完整性。也就是说,它确保外键列中的值是合法值。
此外,更新或删除值时,外键上的cascade
选项会有很大帮助。
答案 1 :(得分:1)
必要的原因是确保data integrity
假设您有一个名为orders
的表和一个名为order details
的表,它们都有一个名为order id
的列。
如果您不使用外键,则可能会为订单表中不存在的订单插入订单详细信息
如果您尝试将订单详细信息添加到非现有订单,则使用外键将使数据库引发错误
如果您删除已有详细信息的订单,它也会引发错误,除非您先删除订单详细信息或在外键上指定cascade delete。
答案 2 :(得分:1)
外键约束的驱动程序需要“数据完整性”。 DBMS(数据库服务器软件)可帮助您在指定外键约束时防止任何意外(无意)修改数据。就像你在帮助DBMS帮助你一样。因此,如果您指定约束,例如,当该产品有未完成的product
时,可能会阻止意外删除orders
。
您同意,当您仔细分析约束并在创建数据库(表)时在SQL中指定它们时,它有助于确保完整性。
当您选择保持对实体的了解时,这非常有用。在数据库级别本身。这是一个很好的开始方法,因为你的表(关系)或多或少是自包含的。另一种方法是将所有这些一致性检查的级别高于数据库。例如,这种方法由MVC框架(如 Rails )采用,其中模型是应用约束的层,表本身不需要指定外键和其他约束。
哪种方法更好取决于你的口味,通常,但你应该在他们的精神中使用积木。