【问题标题】:Creating index with unique constraint for new blank field为新的空白字段创建具有唯一约束的索引
【发布时间】:2019-12-21 18:11:33
【问题描述】:

向现有数据库表 (PA0023) 添加了一个新列。

数据库:HANA

该列应该是唯一的,因此我尝试通过SE11 创建唯一索引约束。

激活成功。但是,通过Utilities... Database Utility创建索引时,出现了错误:

请求:创建索引 PA0023-Z01

...

sql:

CREATE UNIQUE INDEX 'PA0023~Z01' ON 'PA0023'
  ('MANDT',
   'RECORD_KEY')

无法创建唯一索引;发现重复键 [5] 索引中存在多个具有相同 ID 的文档;SAPABAP1:PA0023.$uc_PA0023~Z01$ 内容不唯一,无法定义唯一约束。 rowCount != distinctCount。

该列中没有填充相同值的行。有空值的行被认为是重复的。在开发环境中替换空白后,索引创建良好。这在生产中不太可能,因为在该新字段中有许多记录为空值。

所以我的问题是:有没有办法在不替换空白的情况下创建唯一约束?

【问题讨论】:

  • 除了添加另一列以使索引真正唯一之外,我没有看到其他解决方案。这对你来说是个问题吗? (尽量选择一列尽可能小的索引)
  • 嘿@SandraRossi。目标是使RECORD_KEY单独成为一个唯一的列。
  • 为什么要专注于让它绝对独一无二?我发现在不受您的责任和控制的系统中执行规则是一个苛刻的想法。更好地定义关键“不唯一”。我认为与唯一索引相比,非唯一索引不会显着减慢处理速度。
  • 嘿@SandraRossi。此列表示记录的标识。我们想将约束设置在最低级别,即 DB 级别。
  • @Dorad - 如果它是记录身份,那么区分记录肯定应该是唯一的......

标签: constraints sap hana unique-constraint


【解决方案1】:

如果现有数据不提供唯一性,则无法创建唯一性约束。所以不,如果键有多个 NULL 值,则不能这样做。在创建约束之前,您需要确保数据是唯一的。

这是正常的数据库实践,并非特定于 HANA。

【讨论】:

  • 作为一个例外,IBM DB2“逻辑文件”可以定义选择标准和键。
【解决方案2】:

虽然复合主键确实不能包含任何可为空的列,但允许使用可为空的列定义复合唯一/候选键。唯一的黄金法则是,在添加或更新记录时,如果唯一键中的任何列包含 NULL 值,则索引条目写入数据库。

MySQL 默认执行此操作。 SQL Server 将执行此操作,前提是您将“WHERE columnX IS NOT NULL”添加到键的定义中。 ORACLE与SQL Server相同,只是语法更复杂。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 2019-10-26
    • 1970-01-01
    • 2016-08-29
    • 2016-12-23
    • 2013-11-23
    相关资源
    最近更新 更多