这是我想弄清楚的:应该有一个表来存储我们新的客户管理系统的授权,并且每个授权都有其唯一的标识符。这个约束很容易转换为 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
,只有 NULL
或 TRUE
是可能的。默认 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/