使用 XQuery 更新自动递增?

发布于 2024-08-27 13:05:14 字数 116 浏览 10 评论 0原文

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

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

Does XQuery Update support auto increment attributes, just like auto increment fields in SQL?

I'm using BaseX as my database.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

木有鱼丸 2024-09-03 13:05:14

鉴于 Christian Grün 在 BaseX 邮件列表上的回答< /a>,当要添加的节点是在 XQuery Update 语句中定义时这是可行的,因此可以在插入节点之前使用{封闭表达式} 进行增强:

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

输入.xml:

<根数=“0”/>

插入.xq:

let $root := doc('input.xml')/root
让 $count := $root/@count
返回 (
  插入节点 ;进入$root,
  将节点 $count 的值替换为 $count + 1  
)

我无法使用用 Java 创建并使用 XQJ 添加到 XML 数据库的外部 org.w3c.dom.Document 来实现相同的效果声明变量$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! :)
)

上面,最后插入的文档将始终具有 ,并且不会更新,直到添加下一个文档。 (此外,当存在多个带​​有 的文档时,它也不起作用。)

尽管在上面的示例中,可以成功删除 . .. 部分和使用:

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

...我没有运气在 Java 代码的文档中设置 因为封闭的表达式不会被替换

最后,一些类似解决方案的说明

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

在我们的例子中,id 也会用在 URL 中;那就不太好了。

另请参阅 XRX/自动增量文件 ID使用 XQuery 返回文档 ID

Given an answer from Christian Grün on the BaseX mailing list, this is doable when the node one is adding is defined in the XQuery Update statement, and hence can be enhanced using an {enclosed expression} before inserting it:

You might specify the attribute counter within your XML file/database
and increment it every time when you insert an element. A simple
example:

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  
)

I've not been able to achieve the same with an external org.w3c.dom.Document created in Java, and added to the XML database using XQJ and declare variable $doc external. Here, one might be tempted to update the "auto-increment" data after adding the document. However, the processing model defines that changes are not visible until all the commands have been queued (the Pending Update List). Hence a new document or node is, by definition, simply not visible for updates in the same FLWOR expression. So:

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

...followed by repetitive executions of the following, will NOT work:

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! :)
)

Above, the last inserted document will always have <note id="">, and will not be updated until the next document is added. (Also, it would not work when somehow multiple documents with <note id=""> would exist.)

Though in the example above one could successfully delete the for $note in ... part and use:

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

...I had no luck setting <note id="{ $count }"> in the Document in the Java code, as that enclosed expression would not be replaced then.

Finally, some state for similar solutions:

[...] perform badly as it will lock out concurrent updates. You should consider using xdmp:random() to generate a 64 bit random number for your unique identifier.

In our case, the id would also be used in URLs; not too nice then.

See also XRX/Autoincrement File ID and Using XQuery to return Document IDs.

素罗衫 2024-09-03 13:05:14

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

也许,“是”。

This would depend on the implementation of the underlying data-store, because the auto-increment attribute is on the column definition in relational databases.

Probably, "yes".

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文