例如,在 PostgreSQL 中外键是如何实现的?
我注意到在创建外键时涉及大量散列,因此我假设在引用主键列的外键列上创建基于散列的索引。如果是这样(例如,当我们想从引用表中删除一行时——这个带有主键的行或所谓的主表)我们可以很容易地检查引用表中的行是否实际被引用。而且,可能DBMS要求被引用的主键列上至少有一个B+树索引,因为当我们要向引用表中插入新行时,我们可以很容易地检查是否存在具有所需主键值的行在引用表中。一些消息来源声称触发器用于确保外键约束。
最佳答案
在 Postgres 中,主表中的引用列需要具有 UNIQUE
或 PRIMARY KEY
约束。 Per documentation:
The referenced columns must be the columns of a non-deferrable unique or primary key constraint in the referenced table.
这两者目前总是使用 btree 索引实现。所以在引用的列上总是有一个 btree 索引:
引用列根本不需要索引。如果主表中的行永远不会更新或删除,这可能就足够了。否则,引用列也应该被索引,但这不是由系统强制执行的。这只是关于性能优化,而不是数据完整性。
FK 约束本身的实际实现是系统目录中的一个条目pg_constraint
,一个特殊的内部触发器和另一个条目 pg_depend
.
关于数据库内部 : implementation of a foreign key constraint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29065148/