首页 > 解决方案 > 如何在多列上添加约束以防止重复行?

问题描述

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

表名:camembert,样本数据:

| handle | id  | num   |
| ------ | --- | ----- |
| 259    | 869 | AC003 |
| 259    | 869 | AC003 |
| 259    | 869 | AC003 |
| 259    | 856 | AC005 | 
| 259    | 856 | AC005 |
| 259    | 856 | AC005 |
etc.

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

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

| handle | id    | num   |
| ------ | ----- | ----- |
| 259    | 869   | AC003 |
| 259    | 856   | AC005 |
| 259    | 856   | AC007 |
| 47138  | 41085 | AC003 |
| 47138  | 41085 | AC005 |
| 47138  | 43513 | AC007 |

我尝试了以下脚本:

ALTER TABLE camembert ADD CONSTRAINT num_uniq UNIQUE (num);

但出现错误:

ERROR: could not create unique index "num"
Detail: Key (num)=(AC003) is duplicated.

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

标签: sqlpostgresqldatabase-designunique-constraint

解决方案


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

ALTER TABLE camembert ADD CONSTRAINT num_vals UNIQUE (handle, id, num);

但在此之前,您必须已删除重复项。


推荐阅读