【问题标题】:Will a primary key index serve as an index for a foreign key when fk columns are subset of pk?当 fk 列是 pk 的子集时,主键索引是否会用作外键的索引?
【发布时间】:2014-03-31 03:28:01
【问题描述】:

我有一个表,其中部分主键是另一个表的外键。

create table player_result (
  event_id        integer not null,
  pub_time        timestamp not null,
  name_key        varchar(128) not null,
  email_address   varchar(128),
  withdrawn       boolean not null,
  place           integer,
  realized_values hstore,
  primary key (event_id, pub_time, name_key),
  foreign key (email_address) references email(address),
  foreign key (event_id, pub_time) references event_publish(event_id, pub_time));

为主键生成的索引是否足以支持event_idpub_time 上的外键?

【问题讨论】:

    标签: postgresql indexing composite-primary-key


    【解决方案1】:

    是的。

    索引A,B,C

    适用于:

    A
    A,B
    A,B,C(以及全部 3 个字段的任何其他组合,如果默认顺序不重要)

    但不适用于其他组合(例如B,CC,A 等)。

    【讨论】:

      【解决方案2】:

      这对引用端很有用,这样引用表上的DELETEUPDATE可以使用引用端的PRIMARY KEY在执行检查是否存在引用行或运行级联更新/删除时作为索引。 PostgreSQL 根本不需要这个索引,它只是让外键约束检查更快。

      不足以作为对这些列的引用的唯一约束。您无法创建 FOREIGN KEYREFERENCES player_result(event_id, pub_time),因为这些列上没有 unique 约束。只要每对具有不同的name_key,该对就可以在表格中出现多次。

      正如@xagyg 准确指出的那样,由外键引用创建的唯一b 树索引也仅对索引左侧列的引用有用。例如,它不能用于查找pub_time, name_key 或仅用于name_key

      【讨论】:

        猜你喜欢
        • 2015-11-03
        • 1970-01-01
        • 2011-03-04
        • 2010-09-23
        • 2018-10-02
        • 2017-08-20
        • 2012-08-21
        • 2018-02-06
        • 2011-01-26
        相关资源
        最近更新 更多