XQuery
更新是否支持自动增量属性,就像SQL
中的自动增量字段一样?
我正在使用BaseX
作为我的数据库。
答案 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 ID和Using XQuery to return Document IDs。
答案 1 :(得分:1)
这取决于底层数据存储的实现,因为自动增量属性位于关系数据库的列定义中。
可能,“是”。