sql - 强制列唯一性但允许重复的最佳实践?

标签 sql postgresql database-design unique-index

这是我想弄清楚的:应该有一个表来存储我们新的客户管理系统的授权,并且每个授权都有其唯一的标识符。这个约束很容易转换为 SQL,但不幸的是,由于官僚主义的缓慢,有时我们需要创建一个带有占位符 ID(例如,“temp”)的条目,以便客户端能够开始接受服务.

执行此条件唯一性约束的最佳做法是什么?

以下是我有限的经验所能想到的:

  • 使用 PostgreSQL 手册中提到的部分索引ing ( 5.3.3. -> Example 11-3. )。它还提到 当成功的测试很少而失败的测试很多时,这是一种特别有效的方法。在我们将要迁移的遗留数据库中,有 130,000 行和大约每月 5 个临时授权,但整个表每年仅增长约 200 行。这是正确的方法吗? (我也不确定在这种情况下“高效”是什么意思。)
  • 为临时授权创建一个单独的表,但这样会复制表结构。
  • 为一组列定义唯一约束。授权是在特定时间段内向个人颁发的特定服务。

编辑:

对不起,我认为我对授权 ID 的描述有点晦涩:它是由国家部门提供的,格式为 NMED012345678,并且是手动输入的。它是独一无二的,但有时只在以后提供 for unknown reasons

最佳答案

有一种简单、快速且安全的方法:

添加一个 bool 列来标记默认为 NULL 的临时条目,比如:

temp bool DEFAULT NULL CHECK (temp)

添加的检查约束不允许 FALSE,只有 NULLTRUE 是可能的。默认 NULL 值的存储成本通常是......没有 - 除非该行中没有其他 NULL 值。

列默认意味着您通常不必处理该列。默认情况下为 NULL( which is the default default anyway ,我只是在这里明确说明)。您只需显式标记少数异常(exception)。

然后创建一个部分唯一索引,如:

CREATE UNIQUE INDEX tbl_unique_id_uni ON tbl (unique_id) WHERE temp IS NULL;

这只包括应该是唯一的行。索引大小根本没有增加。 请务必将谓词 WHERE temp IS NULL 添加到应该使用唯一索引的查询中。

相关:

关于sql - 强制列唯一性但允许重复的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44860919/

相关文章:

当我只想要一行时,SQL JOIN 返回多行

SQL:选择包含完全给定成员的集合

SQL - 链接到更多表信息

php - 从sql数据库生成pdf报告

mysql - MySQL 或其他数据库中是否有 cron 的内置替代方案?

postgresql - KnexJS (Postgres) 中等效的数字类型是什么?

postgresql - 如何在 Windows 上 headless (无终端)启动 postgres 服务器?

postgresql - 时间轴和历史文件 postgresql 9.1

mysql - 调查应用程序的关系数据库架构

mysql 唯一键