使用XQuery Update自动增加?

时间:2010-04-01 14:25:55

标签: xquery auto-increment basex xquery-update

XQuery更新是否支持自动增量属性,就像SQL中的自动增量字段一样?

我正在使用BaseX作为我的数据库。

2 个答案:

答案 0 :(得分:2)

给定an answer from Christian Grün on the BaseX mailing list,当在XQuery Update语句中定义添加的节点时,这是可行的,因此可以在插入之前使用{enclosed expression} 进行增强:

  

您可以在XML文件/数据库中指定属性计数器   每次插入元素时都会增加它。一个简单的   例如:

     

input.xml中:

<root count="0"/>
     

insert.xq:

let $root := doc('input.xml')/root
let $count := $root/@count
return (
  insert node <node id='{ $count }'/> into $root,
  replace value of node $count with $count + 1  
)

我无法使用Java创建的外部org.w3c.dom.Document实现相同的功能,并使用XQJ和declare variable $doc external添加到XML数据库中。在这里,人们可能想要在添加文档后更新“自动增量”数据。但是,处理模型定义在所有命令排队(Pending Update List)之前,更改不可见。因此,根据定义,新文档或节点对于同一FLWOR表达式中的更新根本不可见。所以:

db:add('db1', '<counters comment-id="0"/>', 'counters')

...然后重复执行以下操作,将无效:

let $doc := document{ <note id=""><text>Hello world</text></note> }
let $count := /counters/@comment-id 
return (
  db:add('db1', $doc, 'dummy'), 
  replace value of node $count with $count + 1
  for $note in /note[@id=''] 
    return replace value of node $note/@id with $count (: WRONG! :)
)

在上面,最后插入的文档将始终为<note id="">,并且在添加下一个文档之前不会更新。 (此外,如果存在<note id="">的多个文档,它将无法工作。)

虽然在上面的示例中,可以成功删除for $note in ...部分并使用:

let $doc := document{ <note id="{ $count }"><text>Hello world</text></note> }

...我没有运气在Java代码中的as that enclosed expression would not be replaced then文档中设置<note id="{ $count }">

最后,有些state for similar solutions

  

[...]表现不佳,因为它会锁定并发更新。您应该考虑使用xdmp:random()为您的唯一标识符生成64位随机数。

在我们的例子中,id也将用于URL;那不太好。

另请参阅XRX/Autoincrement File IDUsing XQuery to return Document IDs

答案 1 :(得分:1)

这取决于底层数据存储的实现,因为自动增量属性位于关系数据库的列定义中。

可能,“是”。