如何在多列上添加约束以防止重复行?

Ric*_*way 2 sql postgresql database-design unique-constraint

我在 Postgres 数据库中有一个现有的表,该表累积了重复值。我们已清除表并重新填充值,但希望防止再次发生重复。因此我们需要 a 来添加约束。

表名:camembert,样本数据:

| handle | id  | num   |
| ------ | --- | ----- |
| 259    | 869 | AC003 |
| 259    | 869 | AC003 |
| 259    | 869 | AC003 |
| 259    | 856 | AC005 | 
| 259    | 856 | AC005 |
| 259    | 856 | AC005 |
etc.
Run Code Online (Sandbox Code Playgroud)

下面是这个问题的一个例子(我们实际上有所有东西的三份)

该约束应允许前两列具有重复值,但是,第三列是使该行唯一的区别因素。例如,当表被正确填充后,它看起来如下:

| handle | id    | num   |
| ------ | ----- | ----- |
| 259    | 869   | AC003 |
| 259    | 856   | AC005 |
| 259    | 856   | AC007 |
| 47138  | 41085 | AC003 |
| 47138  | 41085 | AC005 |
| 47138  | 43513 | AC007 |
Run Code Online (Sandbox Code Playgroud)

我尝试了以下脚本:

ALTER TABLE camembert ADD CONSTRAINT num_uniq UNIQUE (num);
Run Code Online (Sandbox Code Playgroud)

但出现错误:

ERROR: could not create unique index "num"
Detail: Key (num)=(AC003) is duplicated.
Run Code Online (Sandbox Code Playgroud)

我对唯一约束有什么误解?解开这个谜题的关键语句是什么?

JGH*_*JGH 7

您必须将 3 列的约束添加在一起

ALTER TABLE camembert ADD CONSTRAINT num_vals UNIQUE (handle, id, num);
Run Code Online (Sandbox Code Playgroud)

但在此之前,您必须删除重复的内容。