2

XQueryUpdate は、 の自動インクリメント フィールドと同様に、自動インクリメント属性をサポートしていSQLますか?

データベースとして使用BaseXしています。

4

2 に答える 2

2

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.Documentdeclare 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も参照してください。

于 2012-09-30T14:28:43.027 に答える
1

自動インクリメント属性はリレーショナル データベースの列定義にあるため、これは基になるデータ ストアの実装に依存します。

おそらくそうだ"。

于 2010-04-05T18:20:57.647 に答える