gpt4 book ai didi

oracle - 如何约束多列以防止重复,但忽略空值?

转载 作者:行者123 更新时间:2023-12-04 05:28:04 26 4
gpt4 key购买 nike

这是我在 Oracle 数据库 (10g) 中运行的一个小实验。除了(Oracle 的)实现便利之外,我无法弄清楚为什么接受某些插入而拒绝其他插入。

create table sandbox(a number(10,0), b number(10,0));
create unique index sandbox_idx on sandbox(a,b);

insert into sandbox values (1,1); -- accepted
insert into sandbox values (1,2); -- accepted
insert into sandbox values (1,1); -- rejected

insert into sandbox values (1,null); -- accepted
insert into sandbox values (2,null); -- accepted
insert into sandbox values (1,null); -- rejected

insert into sandbox values (null,1); -- accepted
insert into sandbox values (null,2); -- accepted
insert into sandbox values (null,1); -- rejected

insert into sandbox values (null,null); -- accepted
insert into sandbox values (null,null); -- accepted

假设偶尔有一些列值未知的行是有意义的,我可以想到两个可能涉及防止重复的用例:
1. 我想拒绝重复项,但在任何受限列的值未知时接受。
2. 我想拒绝重复项,即使在受限列的值未知的情况下也是如此。

显然 Oracle 实现了一些不同的东西:
3. 拒绝重复,但(仅)当所有受约束的列值未知时接受。

我可以想出一些方法来利用 Oracle 的实现来获得用例 (2)——例如,为“unknown”设置一个特殊值,并使列不可为空。但我不知道如何使用用例 (1)。

换句话说,我怎样才能让 Oracle 像这样行事?
create table sandbox(a number(10,0), b number(10,0));
create unique index sandbox_idx on sandbox(a,b);

insert into sandbox values (1,1); -- accepted
insert into sandbox values (1,2); -- accepted
insert into sandbox values (1,1); -- rejected

insert into sandbox values (1,null); -- accepted
insert into sandbox values (2,null); -- accepted
insert into sandbox values (1,null); -- accepted

insert into sandbox values (null,1); -- accepted
insert into sandbox values (null,2); -- accepted
insert into sandbox values (null,1); -- accepted

insert into sandbox values (null,null); -- accepted
insert into sandbox values (null,null); -- accepted

最佳答案

尝试基于函数的索引:

在沙箱上创建唯一索引 sandbox_idx(CASE WHEN a IS NULL THEN NULL WHEN b IS NULL THEN NULL ELSE a||','||b END);

还有其他方法可以给这只猫剥皮,但这是其中之一。

关于oracle - 如何约束多列以防止重复,但忽略空值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/675398/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com