2010-04-01 1 views
2

XQuery Обновлять атрибуты автоматического прироста обновления, точно так же как поля автоматического приращения в SQL?Автоматическое увеличение с помощью обновления XQuery?

Я использую BaseX как моя база данных.

+0

Вы когда-нибудь решали это? – Arjan

+0

Нет, я должен был сделать это в приложении, а не в базе данных. –

+0

... а затем использовать другую базу данных для создания уникального идентификатора для вас? Поскольку заявление об обновлении XQuery нельзя комбинировать с возвратом некоторого значения, я даже не могу реализовать некоторую «последовательность базы данных» в базе данных XML ... – Arjan

ответ

1

Это будет зависеть от реализации базового хранилища данных, поскольку атрибут auto-increment находится в определении столбца в реляционных базах данных.

Возможно, «да».

+0

Спасибо за ваш ответ. Я добавил дополнительную информацию к этому вопросу. –

2

Учитывая 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.

+1

Здесь могут помочь обновления документов на основной памяти; более подробную информацию см. на странице http://stackoverflow.com/questions/12697957/can-i-make-xquery-evaluate-expression-within-variables-bound-with-xqj/13212103#comment17990896_13212103. –