2

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

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

4

2 回答 2

2

鉴于BaseX 邮件列表中 Christian Grün 的回答,当要添加的节点在 XQuery 更新语句中定义时,这是可行的,因此可以在插入{enclosed expression} 之前使用 an 来增强它:

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

输入.xml:

<root count="0"/>

插入.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  
)

我无法使用用org.w3c.dom.DocumentJava 创建的外部实现相同的功能,并使用 XQJ 和declare variable $doc external. 在这里,人们可能会想在添加文档后更新“自动增量”数据。但是,处理模型定义在所有命令都已排队(待更新列表)之前,更改不可见。因此,根据定义,新文档或节点对于同一 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> }

<note id="{ $count }">...我在 Java 代码中的 Document 中没有运气设置,因为那个封闭的表达式不会被替换

最后,一些类似解决方案的状态

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

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

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

于 2012-09-30T14:28:43.027 回答
1

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

大概是”。

于 2010-04-05T18:20:57.647 回答