sql - 如何在多列上添加约束以防止重复行?
问题描述
我在 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.
我对唯一约束有什么误解?解开这个谜题的关键语句是什么?
解决方案
您必须将 3 列上的约束一起添加
ALTER TABLE camembert ADD CONSTRAINT num_vals UNIQUE (handle, id, num);
但在此之前,您必须已删除重复项。
推荐阅读
- html - 如何使用缩放缩放背景图像
- notifications - Buildfire:PHP API 发送通知
- flutter - 如何创建左右滑动按钮?
- vue.js - 两个输入上的 Vee-validate v2 ("^2.1.5") (Vue v2)
- reactjs - 为什么 React 使用 createFiber 而不是 new FiberNode?
- javascript - 如何让函数在第二次和第三次(等等)单击 html 按钮时再次运行?
- swift - 如何显示 Firestore 文档中的某些字段
- dataflow-diagram - 如何使用 Yourdon DeMarco 表示法在数据流程图 (DFD) 中表示重复的数据存储?
- c# - StreamReader 与 using 语句的区别?
- shell - /bin/sh: 解析命令行参数导致: shift: can't shift that many