postgresql - Postgres - 具有多列和 NULL 值的唯一约束
问题描述
我对可能包含 NULL 值的多个列的 Postgres 唯一约束有问题。
让我们假设这种情况:
CREATE TEMP TABLE test (
foo TEXT,
bar TEXT,
UNIQUE (foo, bar)
);
INSERT INTO test
VALUES
('foo', NULL),
('foo', NULL),
('foo', 'bar'),
('foo', 'bar')
ON CONFLICT (foo, bar) DO NOTHING;
Insert 将插入 ('foo', 'bar') 一次和 ('foo', NULL) 两次(即使直觉说它应该插入一次)。
在这种情况下,解决方案非常简单。我可以添加唯一索引
CREATE UNIQUE INDEX indx ON test (foo) WHERE bar IS NULL;
但是当有更多的列和不同的类型(不仅仅是文本)时,问题就开始了。假设我们有 10 列,其中 9 列可以NULL
有价值。也许我可以用大量的约束来解决它,但这一点都不方便。
有没有更简单的方法来保持这样的一行的唯一性?
解决方案
禁止 NULL 的良好解决方案的替代方法是创建唯一索引。
您所需要的只是一个保证不会出现在您的数据集中的值(在我的示例中'@@'
):
CREATE UNIQUE INDEX ON test (
coalesce(foo, '@@'),
coalesce(bar, '@@')
);
推荐阅读
- python - 如何使用 libvlc 向视频播放器添加额外的音轨
- javascript - 选择不在元素内的文本
- zsh - zsh:算术扩展:'语法错误:预期操作数(错误标记为“1 + 1”)'
- python - “.replace”运算符不工作 Python
- android-studio - 待办事项列表:复选框激活列表中的每个成员
- arrays - 用尽所有 onTap 功能时无法显示对话框
- kubernetes - Kubeadm 替换节点
- java - 如何在sqlite数据库java中存储对象
- java - 如何对除 api 网关之外的所有人隐藏我的公共微服务?
- python-3.x - 尝试通过 kudu 控制台在 python azure 函数中添加模块(speech_py_impl),但面临虚拟环境问题