Автоинкремент с обновлением XQuery? - PullRequest
2 голосов
/ 01 апреля 2010

Поддерживает ли XQuery обновление атрибуты автоинкремента, как и поля автоинкремента в SQL?

Я использую BaseX в качестве базы данных.

Ответы [ 2 ]

2 голосов
/ 30 сентября 2012

Учитывая ответ Кристиана Грюна в списке рассылки BaseX , это выполнимо, когда добавляемый узел определяется в операторе XQuery Update и, следовательно, может быть улучшен с помощью {enclosed expression} * 1004. * до вставка:

Вы можете указать счетчик атрибутов в вашем 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  
)

Мне не удалось добиться того же с внешним org.w3c.dom.Document, созданным в Java и добавленным в базу данных XML с использованием XQJ и declare variable $doc external. Здесь может возникнуть искушение обновить данные «автоинкремента» после добавления документа. Однако модель обработки определяет, что изменения не будут видны до тех пор, пока все команды не будут поставлены в очередь ( 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, , поскольку это вложенное выражение не будет заменено тогда .

Наконец, некоторые состояния для аналогичных решений :

[...] плохо работает, так как блокирует одновременные обновления. Вам следует рассмотреть возможность использования xdmp: random () для генерации 64-битного случайного числа для вашего уникального идентификатора.

В нашем случае идентификатор также будет использоваться в URL; тогда не слишком приятно

См. Также XRX / идентификатор файла автоинкремента и Использование XQuery для возврата идентификаторов документа .

1 голос
/ 05 апреля 2010

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

Возможно, "да".

...