数据库内部 : implementation of a foreign key constraint

标签 database postgresql database-design foreign-keys

例如,在 PostgreSQL 中外键是如何实现的?

我注意到在创建外键时涉及大量散列,因此我假设在引用主键列的外键列上创建基于散列的索引。如果是这样(例如,当我们想从引用表中删除一行时——这个带有主键的行或所谓的主表)我们可以很容易地检查引用表中的行是否实际被引用。而且,可能DBMS要求被引用的主键列上至少有一个B+树索引,因为当我们要向引用表中插入新行时,我们可以很容易地检查是否存在具有所需主键值的行在引用表中。一些消息来源声称触发器用于确保外键约束。

最佳答案

在 Postgres 中,主表中的引用列需要具有 UNIQUEPRIMARY 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/

相关文章:

sql-server - 字符串数据字段大小的最佳实践是什么?

ruby-on-rails - 是否可以通过 Rails/ActiveRecord 迁移添加基于函数的数据库不可知索引?

php - 奇怪的表更新 codeigniter $this->db->update

sql - PostgreSQL 选择不在其他日期之间的日期之间的日期

database - 表 oracle 锁定

sql - 数据库表设计问题

php - 将翻译放在 JSON 中是个好主意吗?

mysql - 对于社会保险号,我应该使用 INT、CHAR 还是 VARCHAR?

sql - Postgres : Using WITH RECURSIVE to build list of item and their parents

ruby-on-rails - 如何使用大写列名的 Rails?