当前位置: 首页 > 知识库问答 >
问题:

Oracle-对可为空字段的唯一约束

戴树
2023-03-14

关于Oracle中对可为空的列进行唯一约束定义的可能解决方案,我想向你们请教/收集一些想法。

    null
+---+-----------+-----------+-----------+
|ID |FIRST_NAME |LAST_NAME  |EXT_CODE   |
+---+-----------+-----------+-----------+
|1  |Peter      |Pletan     |ABC        |
|2  |John       |Dollar     |DEF        |
|3  |Mia        |Zin        |GHI        |
|4  |Jasper     |Blau       |NULL       |
|5  |George     |Khan       |NULL       |
-----------------------------------------

现在困难的部分来了。我决定,在这个表中,可以存储更多(独立)客户的数据。为此,我添加了名为customer_code的新列。这段代码实际上将表分割成不同的空格,而每个客户只能看到自己的数据。

为此,引入了oracle vpd(虚拟专用数据库)。

  1. 每个客户都使用自己的oracle用户
  2. 登录时,将加载客户代码
  3. 将CUSTOMER_CODE=“MY_CODE”的谓词(在步骤2中加载)追加到每个查询
+---------------+---+-----------+-----------+-----------+
|CUSTOMER_CODE  |ID |FIRST_NAME |LAST_NAME  |EXT_CODE   |
+---------------+---+-----------+-----------+-----------+
|C1             |1  |Peter      |Pletan     |ABC        |
|C1             |2  |John       |Dollar     |DEF        |
|C1             |3  |Mia        |Zin        |GHI        |
|C1             |4  |Jasper     |Blau       |NULL       |
|C1             |5  |George     |Khan       |NULL       |
|C2             |6  |Paul       |Walker     |1          |
|C2             |7  |Simon      |Sleeper    |2          |
|C2             |8  |Lian       |Driver     |3          |
|C2             |9  |Cor        |Pilot      |NULL       |
|C2             |10 |Martin     |Oldman     |NULL       |
---------------------------------------------------------
    null
+---------------+---+-----------+-----------+-----------+
|CUSTOMER_CODE  |ID |FIRST_NAME |LAST_NAME  |EXT_CODE   |
+---------------+---+-----------+-----------+-----------+
|C1             |1  |Peter      |Pletan     |ABC        |
|C2             |2  |John       |Dollar     |ABC        |

我现在有什么可能?1.基于函数的索引(drop unique constraint)-索引,如果any为null,它会将两个值都设置为null,因此它根本不被索引=>可能是一个解决方案,但是索引不能与unique constraint相反地延迟

触发器-它检查数据并抛出异常(仅当两个值都不为空时)

Make ext_code not null-在组合上放置常规唯一约束(ext_code,customer_code)=>不可行选项

共有1个答案

翟曦
2023-03-14

您没有说明使用的是Oracle的哪个版本,但从11g开始,您可以使用具有唯一约束的虚拟列:

alter table customer add (unq_col varchar2(24) -- or necessary size
  generated always as (case when ext_code is null then null
    else customer_code||'~'||ext_code end));
alter table customer add (constraint unq_col_con unique (unq_col));

生成的列可以以您认为安全的任何方式构建--如果您可以标识一个永远不可能在其中一列中的字符,则使用分隔符,或填充,或任何合适的方法。

则尝试在客户内部复制代码将失败:

update customer set ext_code = 'ABC' where ext_code = 'DEF'

Error report -
SQL Error: ORA-00001: unique constraint (SCHEMA.UNQ_COL_CON) violated
00001. 00000 -  "unique constraint (%s.%s) violated"

但对于不同的客户也是可以的:

update customer set ext_code = 'ABC' where ext_code = '1';

1 row updated.
 类似资料:
  • 问题内容: 我有两个表->变量(id,名称)和Variable_Entries(id,var_id,值)。 我希望每个变量都具有唯一的一组条目。如果我使值条目唯一,那么其他变量将无法具有相同的值,这是不正确的。 有什么办法可以使相同的var_id的value列唯一? 问题答案: 是的: 现在,您对var_id和value有了唯一的约束。换句话说,var_id和value的出现不能出现多次。

  • 主要内容:Oracle唯一约束语法,Oracle唯一约束例子在本教程中,您将学习如何使用Oracle唯一约束来确保包含在一列或几列中的数据在表中的行之间是唯一的。 Oracle唯一约束语法 一个唯一的约束是一个完整性约束,它确保存储在一列或一组列中的数据在表中的行之间是唯一的。 通常,在使用内联约束语法创建表时,将唯一约束应用于列,如下所示: 此唯一约束指定中的值在整个表中是唯一的。也可以使用外线()约束语法来定义一个唯一的约束: 可以通过使用子句和约束名

  • 问题内容: 我有这张桌子: 我想创建一个仅在时才适用于字段的唯一约束。 我试图创建一个,但是Oracle说: 什么是正确的语法? 问题答案: @jamesfrj:您似乎正在尝试确保您的表应只包含一个记录。 您可以尝试通过串联各列来创建唯一的功能索引,如下所示 希望能帮助到你

  • 问题内容: 我们有一个遗留数据库架构,该架构具有一些有趣的设计决策。直到最近,我们仅支持Oracle和SQL Server,但是我们试图添加对PostgreSQL的支持,这带来了一个有趣的问题。我已经搜索了Stack Overflow和Internet的其余部分,但我不认为这种特殊情况是重复的。 对于唯一约束中的可为空的列,Oracle和SQL Server的行为相同,这实际上是在执行唯一检查时忽

  • 问题内容: 我有Foo模型,其中有栏杆。bar字段应该是唯一的,但允许为空,这意味着如果bar字段为,我想允许多个记录,但如果不是,则值必须是唯一的。 这是我的模型: 这是该表的相应SQL: 当使用管理界面在bar为null的情况下创建多个1个foo对象时,它给我一个错误:“此Bar的Foo已经存在。” 但是,当我插入数据库(PostgreSQL)时: 这样做很好,它允许我插入1条以上且bar为n

  • 问题内容: 我有一个带有列“ position”的表“ items”。位置具有唯一且非空的约束。为了在位置x插入新行,我首先尝试增加后续项的位置: 这导致了唯一的约束冲突: 问题似乎出在PostgreSQL执行更新的顺序上。PostgreSQL <9.0中的唯一约束是不可延迟的,不幸的是,当前无法使用9.0。另外,UPDATE语句不支持ORDER BY子句,并且以下命令也不起作用(仍然重复键冲突)