从我收集到的信息来看,使用 有两个主要好处REFERENCES
,并且在使用和不使用它之间有一个重要的区别FOREIGN KEY
。
它为 DBMS 提供了优化空间
如果不使用 REFERENCES,SQLite 将不知道属性id
和属性wizard_id
在功能上是等效的。您可以为数据库管理系统(在本例中为 SQLite)定义的已知约束越多,它在优化其在后台处理数据的方式方面的自由度就越大。
它可以强制或鼓励良好做法
参考声明也可用于执行和警告规定。例如,假设您有两个表A
和B
,并且您假设它A.name
在功能上等同于B.name
,因此您尝试连接:SELECT * FROM A, B WHERE A.name = B.name
。如果 REFERENCE 从未用于指示这两个属性之间的功能等效性,则 DBMS 可能会在您进行连接时向您发出警告,这在这些属性恰好具有相同名称但实际上并不代表一样。
REFERENCES
并不总是创建“外键”
与已经建议的相反,引用和外键不是一回事。引用声明属性之间的功能等效性。外键是指另一个表的主键。
编辑:@IanMcLaird 纠正了我:使用REFERENCES
确实总是创建某种外键,尽管这与外键的流行定义相冲突,即“表中引用另一个表的主键的一组属性” (维基百科)。
使用REFERENCES
withoutFOREIGN KEY
可能会创建一个与流行的“外键”定义相反的“列级外键”。
以下陈述之间存在差异。
driver_id INT REFERENCES Drivers
driver_id INT REFERENCES Drivers(id)
driver_id INT,
FOREIGN KEY(driver_id) REFERENCES Drivers(id)
第一条语句假定您要引用的主键,Drivers
因为没有指定属性。第三条语句要求id
是 的主键Drivers
。两者都假设您想按照上面提供的流行定义创建外键;两者都创建表级外键。
第二个说法很棘手。如果指定一个属性是 的主键Drivers
,DBMS 可能会选择创建一个表级外键。但指定的属性不必是的主键Drivers
,如果不是,DBMS 将创建列级外键。对于那些第一次接触数据库并学习不太灵活、流行的“外键”定义的人来说,这有点不直观。
有些人可能会使用这三个语句,就好像它们是相同的,并且在许多一般用例中它们可能在功能上相同,但它们并不相同。
说了这么多,这只是我的理解。我不是这方面的专家,非常感谢补充、更正和肯定。