【问题标题】:Oracle: selective uniqueness index issue with updateOracle:更新时的选择性唯一性索引问题
【发布时间】:2011-10-09 00:01:28
【问题描述】:

我已经创建了选择性唯一索引

CREATE UNIQUE INDEX fn_unique_idx 
    ON table1 (CASE WHEN is_deleted='N' THEN id ELSE null END,
               CASE WHEN is_deleted='N' THEN name ELSE null END,
               CASE WHEN is_deleted='N' THEN type ELSE null END);

因此,在任何时候,我都只想要一个带有 is_deleted 'N' for (id, name, type) 的条目。

插入工作正常,即当我尝试使用预期的 is_deleted = 'N' 插入时,它允许输入多个 is_deleted 'Y' 并抛出独特的约束异常。

但是当我尝试更新它时 预言机错误:

ORA-00600: internal error code, arguments: [qctVCO : bfc], [1], [0], [1], [871], [1], [2], [875], [], [], [], [] 


SQL : UPDATE table1 set is_deleted = 'Y' where id = 1, name = 'foo' and type =bar';

我想将此当前条目设置为已删除,并插入一个包含更新数据的新条目,并且 is_deleted = 'N'。这基本上是为了维护历史。

谁能帮我解决这个问题。

谢谢。

【问题讨论】:

    标签: sql oracle indexing constants


    【解决方案1】:

    这种类型的错误是 oracle 内部错误 - 也就是错误...

    您使用的是哪个补丁版本?以防万一,也许去当前的那个。

    【讨论】:

    • Oracle 版本是 Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
    • qctVCO:bfc 在 11.1 中唯一发布的错误是 7599848,它与从具有索引的加密列的表中进行选择有关 - 在 Windows 上的 11.7.0.7 补丁 6 和 11.2 中已修复。 0.1。除非您使用 TDE,否则可能不相关,但我同意 Randy 的观点,进行修补,如果它没有消失,那么请向 Oracle 提出 SAR。不过我还是会看看布兰科的建议。 (我假设命令和缺少的引号是转录错误,而您的实际 SQL 更新是有效的?)
    【解决方案2】:

    如果我了解您要完成的工作,您希望能够有几行具有相同的(id, name, type)。对于其中一行is_deleted = 'N',其余行is_deleted = 'Y'

    对吗?

    如果是这样,让我提供一些想法:

    1. 删除is_deleted 字段。相反,有一个version 字段,无论最新版本是什么,这都是未被删除的行。唯一约束/索引自然覆盖(id, name, type, version)。不过,这可能会使查询复杂化。
    2. 引入 3 个新字段:archive_idarchive_namearchive_type。唯一约束仍然覆盖原来的(id, name, type)。通过将值移动到archive_* 字段并对原始字段进行NULL 化,该行被“删除”。这应该可行,因为包含所有 NULL 的元组不包含在(唯一)索引中。
    3. 为归档数据创建一个单独的表,没有唯一性约束。
    4. 也许使用 CONSTRAINT UNIQUE 而不是 UNIQUE INDEX?

    另外,请告诉我们是否存在任何参照完整性约束?

    【讨论】:

    • 另一个不错的技巧是创建一个单独的表 (is_deleted) 并包含原始表中的主键列,最后是一个细粒度的安全策略,可防止您在原始表中看到行主键存在于第二个表中。 (您可以通过在第二张桌子中翻转旗帜来玩可见性游戏)
    【解决方案3】:

    第 3 点上同意 Branko。您还可以将 START 和 END 日期添加到这个单独的表格中以获取存档数据。

    【讨论】:

      猜你喜欢
      • 2011-10-05
      • 2014-10-01
      • 1970-01-01
      • 2023-04-04
      • 2015-12-03
      • 2011-02-08
      • 1970-01-01
      • 2015-11-18
      • 1970-01-01
      相关资源
      最近更新 更多