Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 定义唯一约束时,列顺序是否重要_Postgresql - Fatal编程技术网

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上定义了唯一约束,则索引无法用于此查询