定义唯一约束时列顺序重要吗

时间:2018-10-03 03:11:19

标签: postgresql

这怎么样

=IF(ISNA(INDEX(Sheet5!$A$4:$AG$30,MATCH($C$25,Sheet5!G4:G30,0),2)),"",INDEX(Sheet5!$A$4:$AG$30,MATCH($C$25, Sheet5!G4:G30,0),2))

与此不同吗?

CREATE TABLE foo (
    id   SERIAL PRIMARY KEY,
    col1 VARCHAR(50) NOT NULL,
    col2 VARCHAR(50) NOT NULL,
    col3 DOUBLE PRECISION NULL,
    UNIQUE(col1, col2)
);

据我了解,两个命令都会在两列上生成一个索引,以强制执行唯一约束,但顺序不同。

因此,无论哪种情况,我都不需要生成单独的索引来加快此类查询的速度。

CREATE TABLE foo (
    id   SERIAL PRIMARY KEY,
    col1 VARCHAR(50) NOT NULL,
    col2 VARCHAR(50) NOT NULL,
    col3 DOUBLE PRECISION NULL,
    UNIQUE(col2, col1) -- reversed column ordering
);

但是,如果以后的查询还包括仅按“ col2”列进行查询(如后一种形式),则首选使用后者,因为索引仍然可以使用吗?

SELECT id, col3 FROM foo WHERE col1 = 'stack' AND col2 = 'overflow'

1 个答案:

答案 0 :(得分:0)

如果您希望将索引用作部分索引,则顺序很重要。例如,假设您在(col1, col2)上有一个唯一索引,并且想优化以下查询:

SELECT col1, col2 FROM foo WHERE col1 = 'stack';

此处仍可以使用(col1, col2)上的索引,因为出现在col1子句中的WHERE是索引的最左侧部分。如果您在(col2, col1)上定义了唯一约束,则该索引不能用于此查询。