XQuery Update

From BaseX Documentation
Revision as of 12:52, 6 December 2010 by (talk)
Jump to navigation Jump to search

With the release of version 6.0, BaseX offers a complete implementation of XQuery Update.


In BaseX, all updates are performed on database nodes. This is why update operations never affect the original input file. You can, however, use the <a href='commands#export'>EXPORT</a> command or the XQuery function fn:put() to create an updated XML file.


As BaseX aims mainly for efficiency, the maintenance of indexes is left to the user. This requires the user to call the <a href='commands#optimize'>OPTIMIZE</a> command if up-to-date index structures are necessary. Using this approach guarantees fast updates and fast access at the same time.


So far BaseX differentiates between fragments and database nodes. Updates on fragments have no effect on any existing databases and are therefore not applied at all. This includes the test for violation of any constraints. Thus it is possible to execute an update on a fragment, which would raise an error if applied on a database node.

Example (correct):

Query: insert node attribute id{'1'} into <a id='0'/>


Example (incorrect):

File 'doc.xml': <n id='1'/>

Query: insert node attribute id{'0'} into doc('doc.xml')//n

Result: [XUDY0021]Duplicate attribute "id".


As a consequence, updates on a fragment are not visible in an XML file created with fn:put(). If this functionality is required, the transform expression can be applied. The copied nodes in a transform expression are internally treated like database nodes and are updatable as a result.



let $n := <n/> return (insert node <x/> into $n, put($n,'doc.xml'))

File 'doc.xml': <n/>


    copy $nn := <n/>
    modify insert node <x/> into $nn
    return $nn,

File 'doc.xml': <n> <x/> </n>