Difference between revisions of "XQuery Update"

From BaseX Documentation
Jump to navigation Jump to search
Line 8: Line 8:
 
==Effects on Your Documents==  
 
==Effects on Your Documents==  
 
<p>In BaseX, all updates are performed on database nodes. This is why update operations
 
<p>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 [[Commands|Export]] command or the fn:put() function to create an updated XML file.</p>
+
never affect the original input file. You can, however, use the [[Commands#Export|Export]] command or the fn:put() function to create an updated XML file.</p>
  
 
==Indexes==
 
==Indexes==

Revision as of 10:41, 7 December 2010

With the release of version 6.0, BaseX offers a complete implementation of the XQuery Update Facility (XQUF).

New Expressions

The XQUF offers five new expressions to modify data. While insert, delete, rename and replace basically explain themselves, the transform expression is different. Modified nodes are copied in advance and the original databases remain untouched.

fn:put() Function

Effects on Your Documents

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 Export command or the fn:put() function to create an updated XML file.

Indexes

As BaseX aims mainly for efficiency, the maintenance of indexes is left to the user. This requires the user to call the Optimize command if up-to-date index structures are necessary. Using this approach guarantees fast updates and fast access at the same time.

Fragments

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.

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

Result:

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

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

Result: [XUDY0021]Duplicate attribute "id".

fn:put() and Fragments

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.

Example:

Query:

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

File 'doc.xml': <n/>

Query:

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

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