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

Mysql 为什么有必要在数据库中显式指定外键和引用?,mysql,sql,foreign-keys,foreign-key-relationship,Mysql,Sql,Foreign Keys,Foreign Key Relationship,您能解释一下为什么在创建表时需要指定这些外键吗? 我的意思是,我已经创建了两个具有一对多关系的表(在ER图上),但是我没有指定外键和引用。我可以使用where子句连接表,甚至可以执行连接等等 也许,我没有一些基本的概念,尽管我读过一些关于它的东西。我想这与数据一致性或引用完整性等有关 那么,你能给我解释一下这些概念吗? 如果我有8-10个具有一对多关系的表,并且如果我可以确保数据正确插入数据库,那么这些引用和外键是绝对必需的吗?之所以必须是为了确保。 假设您有一个名为orders的表和一个名为o

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

也许,我没有一些基本的概念,尽管我读过一些关于它的东西。我想这与数据一致性或引用完整性等有关

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

之所以必须是为了确保。
假设您有一个名为
orders
的表和一个名为
orderdetails
的表,它们都有一个名为
orderid
的列
如果不使用外键,则可能会插入订单表中不存在的订单的订单详细信息。
如果您试图将订单详细信息添加到不存在的订单中,则使用外键将使数据库引发错误。
如果删除已包含详细信息的订单,也会引发错误,除非先删除订单详细信息或在外键上指定。

无需指定外键关系。这只是个好主意

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


此外,当值被更新或删除时,外键上的
级联
选项有很大帮助。

外键约束的驱动因素是需要“数据完整性”。当您指定外键约束时,DBMS(数据库服务器软件)可以帮助您防止意外(无意)修改数据。就像你在帮助DBMS帮助你一样。因此,例如,如果您指定了约束条件,则当产品存在未完成的
订单时,可以防止意外删除
产品

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

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

通常,哪种方法更好取决于你的品味,但你应该在他们的精神中使用构建块