XQuery
Update は、 の自動インクリメント フィールドと同様に、自動インクリメント属性をサポートしていSQL
ますか?
データベースとして使用BaseX
しています。
XQuery
Update は、 の自動インクリメント フィールドと同様に、自動インクリメント属性をサポートしていSQL
ますか?
データベースとして使用BaseX
しています。
BaseXメーリング リスト で Christian Grün からの回答があれば、これは、追加するノードが XQuery Update ステートメントで定義されている場合に実行可能であり、挿入する{enclosed expression}
前にを使用して拡張できます。
XML ファイル/データベース内で属性カウンターを指定し、要素を挿入するたびにそれをインクリメントすることができます。簡単な例:
入力.xml:
<root count="0"/>
挿入.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 )
Java で作成され、 XQJorg.w3c.dom.Document
と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 コードの Document に運がありませんでした。
最後に、同様のソリューションのいくつかの状態:
[...]同時更新がロックアウトされるため、パフォーマンスが低下します。xdmp:random() を使用して、一意の識別子用に 64 ビットの乱数を生成することを検討する必要があります。
この場合、id は URL でも使用されます。あまり良くない。
XRX/Autoincrement File IDおよびUsing XQuery to return Document IDsも参照してください。
自動インクリメント属性はリレーショナル データベースの列定義にあるため、これは基になるデータ ストアの実装に依存します。
おそらくそうだ"。