XQuery
Обновлять атрибуты автоматического прироста обновления, точно так же как поля автоматического приращения в SQL
?Автоматическое увеличение с помощью обновления XQuery?
Я использую BaseX
как моя база данных.
XQuery
Обновлять атрибуты автоматического прироста обновления, точно так же как поля автоматического приращения в SQL
?Автоматическое увеличение с помощью обновления XQuery?
Я использую BaseX
как моя база данных.
Это будет зависеть от реализации базового хранилища данных, поскольку атрибут auto-increment находится в определении столбца в реляционных базах данных.
Возможно, «да».
Спасибо за ваш ответ. Я добавил дополнительную информацию к этому вопросу. –
Учитывая an answer from Christian Grün on the BaseX mailing list, это выполнимо, когда узел один добавляет определено в операторе XQuery Update, и, следовательно, может быть повышена используя {enclosed expression}
перед тем вставив:
Вы можете указать счетчик атрибута в вашем файле/базе данных и увеличивайте его каждый раз, когда вы вставляете элемент. Простой пример:
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 )
Я не смог достичь того же с внешним org.w3c.dom.Document
созданного в Java , и добавлен в базу данных XML с использованием XQJ и declare variable $doc external
. Здесь может возникнуть соблазн обновить данные «auto-increment» после добавления документа. Тем не менее, модель обработки определяет, что изменения не отображаются до тех пор, пока все команды не будут поставлены в очередь (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> }
... Я не везло установка <note id="{ $count }">
в документе в коде Java, as that enclosed expression would not be replaced then.
Наконец, некоторые state for similar solutions:
[...] выполняет плохо, как он будет блокировать одновременные обновления. Вы должны использовать xdmp: random() для генерации 64-битного случайного числа для вашего уникального идентификатора.
В нашем случае идентификатор также будет использоваться в URL-адресах; не так хорошо.
См. Также XRX/Autoincrement File ID и Using XQuery to return Document IDs.
Здесь могут помочь обновления документов на основной памяти; более подробную информацию см. на странице http://stackoverflow.com/questions/12697957/can-i-make-xquery-evaluate-expression-within-variables-bound-with-xqj/13212103#comment17990896_13212103. –
Вы когда-нибудь решали это? – Arjan
Нет, я должен был сделать это в приложении, а не в базе данных. –
... а затем использовать другую базу данных для создания уникального идентификатора для вас? Поскольку заявление об обновлении XQuery нельзя комбинировать с возвратом некоторого значения, я даже не могу реализовать некоторую «последовательность базы данных» в базе данных XML ... – Arjan