Postgresql 定义唯一约束时,列顺序是否重要
这是怎么回事Postgresql 定义唯一约束时,列顺序是否重要,postgresql,Postgresql,这是怎么回事 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)
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
);
据我所知,这两个命令将在两列上生成一个索引,以强制执行唯一约束,但顺序不同
因此,在这两种情况下,我都不需要生成单独的索引来加速这样的查询
SELECT id, col3 FROM foo WHERE col1 = 'stack' AND col2 = 'overflow'
但是,如果将来的查询也需要单独按col2列进行查询,如下图所示,最好使用后一种形式,因为索引仍然可用,对吗
SELECT id, col3 FROM foo WHERE col2 = 'overflow'
如果您希望将索引用作部分索引,则顺序很重要。例如,假设您在col1、col2上有一个唯一的索引,并且希望优化以下查询:
SELECT col1, col2 FROM foo WHERE col1 = 'stack';
这里仍然可以使用col1、col2上的索引,因为出现在WHERE子句中的col1是索引的最左边部分。如果在col2、col1上定义了唯一约束,则该索引无法用于此查询。如果希望将该索引用作部分索引,则顺序很重要。例如,假设您在col1、col2上有一个唯一的索引,并且希望优化以下查询:
SELECT col1, col2 FROM foo WHERE col1 = 'stack';
这里仍然可以使用col1、col2上的索引,因为出现在WHERE子句中的col1是索引的最左边部分。如果在col2、col1上定义了唯一约束,则索引无法用于此查询