为新的空白字段创建具有唯一约束的索引

时间:2019-08-15 09:08:13

标签: constraints sap hana unique-constraint

新列已添加到现有数据库表(PA0023)。

DB:HANA

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

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!= distanceCount。

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

所以我的问题是:有没有一种方法可以创建唯一约束而不替换空白?

2 个答案:

答案 0 :(得分:1)

如果现有数据不能提供唯一性,则不能创建唯一性约束。因此,如果键具有多个NULL值,则不能执行此操作。创建约束之前,您需要确保数据是唯一的。

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

答案 1 :(得分:0)

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

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