如何在两列中添加postgres中的唯一约束,其中一列的值为“true”

时间:2018-05-07 06:58:25

标签: sql postgresql

我有一张桌子,其中我需要唯一的EmpId。重复是当有多个条目具有相同EmpId isDeleted = false

的条目时
CREATE TABLE someTable (
    id serial primary key,
    EmpId character varying(15) NOT NULL,
    EmpName character varying(15),
    isDeleted boolean,

    unique (EmpId , isDeleted )//where isDeleted is false
)

2 个答案:

答案 0 :(得分:2)

没有这种约束,但您可以创建一个部分唯一索引(使用唯一索引实现唯一约束):

CREATE UNIQUE INDEX ON sometable (empid) WHERE NOT isdeleted;

这将完全符合您的要求。

答案 1 :(得分:-2)

我认为,为此,您不能使用UNIQUE约束,但需要创建自定义函数

CREATE FUNCTION check_empID(varchar, boolean) RETURNS BOOLEAN
AS 
// your implementation

然后将其与CHECK约束

一起使用
CREATE TABLE someTable (
    id serial primary key,
    EmpId character varying(15) NOT NULL,
    EmpName character varying(15),
    isDeleted boolean,

    CONSTRAINT ck_active_emp CHECK (check_empID(EmpId, isDeleted))
)

由于该函数将使用该表,因此您可以创建没有约束的表,以便您可以创建和测试您的函数。然后改变表以稍后添加约束