2

我在我的数据库上创建了一些对象,我需要删除一些与它们相关的重复属性。我试图运行的查询是:

UPDATE gemp1_product objects REMOVE ingredients[1] WHERE (r_object_id = '08015abd8002cd68')

但我得到的只是以下错误消息:

查询数据库时出错。[DM_QUERY_E_UPDATE_INDEX] 错误:“更新:无法删除索引 1 处的属性成分。” [DM_OBJECT_W_DELETE_ATTR_POSITION_ERROR]警告:“尝试删除不存在的属性 88”

对象08015abd8002cd68存在,我可以在数据库中看到它。SELECT 和 DELETE 之类的查询工作正常,但我不想删除整个对象。

4

2 回答 2

1

没有简单的方法可以做到这一点。原因是重复属性是有序的,以使给定对象的多个重复属性能够同步。

任何一个

  1. 将给定位置的属性值设置为空,并更改代码以丢弃空属性,
  2. 使用多个 DQL 语句来打乱顺序,使最后一个变为空,或者
  3. 更改您的数据模型,例如使用单个属性作为带有预定义分隔符的属性包。

详情 (1)

UPDATE gemp1_product OBJECTS SET ingredients[1] = '' WHERE ...

详情 (2)

对于每个索引;首先找到index+1的值:

SELECT ingredients
FROM gemp1_product
WHERE (i_position*-1)-1 = <index+1>
ENABLE (ROW_BASED)

在新查询中使用该值:

UPDATE gemp1_product OBJECTS SET ingredients[1] = '<value_from_above>' WHERE ...

也应该可以通过以某种方式嵌套 DQL 来做到这一点,但这可能不值得。

于 2015-01-07T16:09:08.070 回答
0

您的查询或存储库有问题。我认为您在 UPDATE 查询中输入了错误的属性名称或使用了错误的索引。如果你用谷歌搜索,DM_OBJECT_W_DELETE_ATTR_POSITION_ERROR你会在这个链接上看到更详细的解释:

原因:程序执行了一个 DeleteAttr 操作,该操作指定了一个不存在的属性位置(负数或大于对象中属性数的数字)。

从这里你可以猜到类型不是处于一致状态,或者你试图删除你的重复属性的太大索引等。你是否使用一致性检查器作业和其他类似的作业检查了你的存储库?

至于使用 DQL 查询删除重复属性 (sttribute) 值,这对于单个查询是无法实现的,因为您需要指定一开始不知道的索引位置。但是,如果要删除的值不多,则编写一个简单的脚本或手动执行是您想要的方式。

于 2015-01-08T00:35:02.503 回答