我有一个表,其中主键的一部分是另一个表的外键。
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_id
和pub_time
上的外键?
答案 0 :(得分:2)
是
索引A,B,C
适合:
A
A,B
A,B,C
(以及完整3个字段的任何其他组合,如果默认顺序不重要)
但不适合其他组合(例如B,C
,C,A
等。)
答案 1 :(得分:2)
对于引用方非常有用,因此引用的表上的DELETE
或UPDATE
可以使用{{1在检查是否存在引用行或运行级联更新/删除时,引用方作为索引。 PostgreSQL根本不需要这个索引,它只是让外键约束检查更快。
足以作为引用对这些列的唯一约束。您无法创建PRIMARY KEY
FOREIGN KEY
,因为这些列上没有REFERENCES player_result(event_id, pub_time)
约束。只要每对具有不同的unique
,该对就会在表格中出现多次。
正如@xagyg准确指出的那样,外键引用创建的唯一b-tree索引也仅对索引左侧列的引用有用。例如,它不能用于name_key
或pub_time, name_key
的查找。