当fk列是pk的子集时,主键索引是否可以作为外键的索引?

时间:2014-03-31 03:28:02

标签: postgresql indexing composite-primary-key

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

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上的外键?

2 个答案:

答案 0 :(得分:2)

索引A,B,C

适合:

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

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

答案 1 :(得分:2)

对于引用方非常有用,因此引用的表上的DELETEUPDATE可以使用{{1在检查是否存在引用行或运行级联更新/删除时,引用方作为索引。 PostgreSQL根本不需要这个索引,它只是让外键约束检查更快。

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

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