在MySQL中,为什么我必须定义ForeignKey关系?

在MySQL中,为什么我必须定义ForeignKey关系?,mysql,sql,database,relational-database,Mysql,Sql,Database,Relational Database,为什么我不能把这些关系排除在外 它们有什么意义 我仍然可以运行查询,并将它们视为一种关系……是的,您可以始终忽略外键约束,但随后您将对数据的完整性负责。如果使用外键约束,则不必担心表之间的引用完整性。您可以从中阅读有关引用完整性的更多信息。我还将尝试用下面的一个例子来解释它 想象一个购物车场景。您有三个表:item、shopping\u cart和shopping\u cart\u item。您可以选择不定义这些表之间的任何关系,这对于任何SQL解决方案都是好的。当用户开始购物时,您可以通过添加

为什么我不能把这些关系排除在外

它们有什么意义


我仍然可以运行查询,并将它们视为一种关系……

是的,您可以始终忽略外键约束,但随后您将对数据的完整性负责。如果使用外键约束,则不必担心表之间的引用完整性。您可以从中阅读有关引用完整性的更多信息。我还将尝试用下面的一个例子来解释它

想象一个购物车场景。您有三个表:
item
shopping\u cart
shopping\u cart\u item
。您可以选择不定义这些表之间的任何关系,这对于任何SQL解决方案都是好的。当用户开始购物时,您可以通过添加
shopping\u cart
条目来创建购物车。当用户将项目添加到他的购物车时,您可以通过将行添加到
shopping\u cart\u item
表来保存此信息

这一步可能会出现一个问题:如果您有一个错误代码,它将不正确的
购物车id
分配给
购物车项目
s,那么您肯定会得到不正确的数据!是的,如果分配的id实际存在于
购物车
表中,则即使有外键约束,也可以出现这种情况。但是,当外键存在时,此错误将更容易检测到,因为当外键约束失败时,它不会插入
购物车项目
记录

让我们继续假设您的代码没有bug,并且不会有第一种类型的引用完整性。然后突然,一个用户想要停止购物并删除购物车,而您选择通过删除
购物车
购物车项目
条目来实现这种情况。然后,您必须使用两个单独的查询删除两个表中的条目。如果在删除
购物车
条目后出现问题,那么您将再次遇到引用完整性问题:您将拥有与任何
购物车
无关的
购物车
项。然后,您必须引入事务管理,尝试向您的业务逻辑提供关于数据访问层中发生的错误的有意义的数据,等等

在这种情况下,外键可以挽救生命。您可以定义外键约束以防止插入任何类型的错误数据,还可以定义级联操作以自动执行相关数据的删除


如果有任何不清楚的地方,请留下评论,我可以改进答案。

创建外键以指示数据库引擎确保从不在数据库上执行创建无效记录的操作

因此,如果在
users.id
visions.userid
之间创建外键关系,引擎将拒绝执行导致
visions
中的
userid
值在
users
中不存在的任何操作。这可能是将未知的
用户id
添加到
访问
,从
用户
中删除已存在于
访问
中的
id
,或更新任一字段以“断开”关系


这就是主键和外键被称为引用完整性约束的原因。告诉您的数据库引擎如何保持数据正确。

它不允许您输入另一个表中不存在的id,例如,如果您有产品并且您保留了所有者id,请在所有者表的“所有者id到id”字段中创建外键,您不允许用户创建所有者id在所有者表中不存在的对象记录。这种东西叫做


外键约束有助于确保引用完整性

如果删除一个表中的一行,mysql可以通过外键自动删除被删除行引用的其他表中的所有行。您还可以使其拒绝删除命令

另外,当您尝试插入一行时,mysql可以在其他表中自动创建新行,因此外键不会引用任何内容


这就是引用完整性的全部含义。

除了其他人所说的为什么您在技术上想要(实际上:需要)它们之外:
外键约束也记录您的模型


查看没有FK约束的模型时,您不知道哪个表与哪个表相关。但有了FK约束,您可以立即看到事物是如何组合在一起的。

数据库受影响的不仅仅是应用程序。并非所有的数据更改都会通过应用程序进行,即使它们应该通过应用程序。人们总是直接在数据库上更改内容。需要始终应用于所有数据的规则属于数据库。假设您可以更新股票的价格。这是伟大的更新个人价格。但当老板决定将所有价格提高15%时会发生什么。没有人会通过GUI一次一个地修改10000个价格,他们会编写一个快速SQL脚本来进行更新。或者假设两个供应商合并成一家公司,您希望将所有这些项目都更改为新公司。这些类型的更改每天都发生在数据库上,它们也需要遵循数据完整性规则

新开发人员可能不知道外键关系应该存在的所有位置,因此会犯错误,导致数据不再有用


没有外键约束的数据库中有接近100%的几率存在坏数据。你真的想在无法识别客户身份的情况下下下订单吗

FKS将阻止您删除拥有订单的客户,例如,如果您使用的是