提要:在本教程中,你将学习到如何通过 PostgreSQL 的 UNIQUE 约束来确保某字段或某些字段组合的值在表里是唯一的。

有时候,需要确保某个字段或某组字段的值在整个表里是唯一的,比如:Email 地址、用户名、员工 ID 等。PostgreSQL 提供了唯一(UNIQUE)约束来正确地维护数据的唯一性。

有了唯一约束,在每次插入数据的时候,PostgreSQL 都会判断这个值是否已存在于表中。如果它发现这个值已经存在,将返回错误信息,并拒绝将数据插入到表里。更新数据的时候,也是相同的机制。

当添加唯一约束的时候,PostgreSQL 会自动给对应的单个字段或组合字段添加 btree 索引。

唯一约束示例

下面的语句创建了一个 person 表,并将唯一约束应用到 email 字段:

CREATE TABLE person (
 id serial PRIMARY KEY,
 first_name VARCHAR (50),
 last_name VARCHAR (50),
 email VARCHAR (50) UNIQUE
);

可以用下面的语法重写上例:

CREATE TABLE person (
 id SERIAL  PRIMARY KEY,
 first_name VARCHAR (50),
 last_name  VARCHAR (50),
 email      VARCHAR (50),
        UNIQUE(email)
);

首先,我们给 person 表添加一条新记录:

INSERT INTO person(first_name,last_name,email)
VALUES
 (
 'wrdll',
 'ivix',
 'wrdll@sjk66.com'
 );

然后,我们插入另一条记录,这条记录使用了相同的 Email 地址:

INSERT INTO person(first_name,last_name,email)
VALUES
 (
 'wrdll',
 'ivix',
 'wrdll@sjk66.com'
 );

PostgreSQL 将返回一个错误:

[Err] ERROR:  duplicate key value violates unique constraint "person_email_key"
DETAIL:  Key (email)=(wrdll@sjk66.com) already exists.

在多个字段上应用唯一约束

PostgreSQL 允许你将一个唯一约束应用到多个字段上,语法如下:

CREATE TABLE table (
    c1 data_type,
    c2 data_type,
    c3 data_type,
    UNIQUE (c2, c3)
);

c2c3 的组合值将在全表唯一。而 c2 和/或 c3 单个字段的值并不唯一。

使用唯一索引添加唯一约束

有时候,可以想使用一个已存在的唯一索引,将唯一约束添加到单个或一组字段上。

首先,假设我们有一张 equipment 表:

CREATE TABLE equipment (
 id serial PRIMARY KEY,
 name VARCHAR (50) NOT NULL,
 equip_id VARCHAR (16) NOT NULL
);

然后,我们给 equip_id 字段添加唯一索引:

CREATE UNIQUE INDEX CONCURRENTLY equipment_equip_id 
ON equipment (equip_id);

最后,使用 equipment_equip_id 索引添加唯一约束:

ALTER TABLE equipment 
ADD CONSTRAINT unique_equip_id 
UNIQUE USING INDEX equipment_equip_id;
上一篇:PostgreSQL 主键
下一篇:PostgreSQL COALESCE