1

このMySQLがXML属性を更新するのと少し関係がありますが、今回はノードの値を更新したいと思います。marcxml 列にある次の XMLfragment があります。

<leader>00227nz  a2200109n  4500</leader>
<controlfield tag="001">1</controlfield>
   ...
<controlfield tag="005">20091210091717.0</controlfield>
        ...

クエリに基づいて数値になるように、制御フィールド値タグ 001 を更新したいと考えています。このように:

<leader>00227nz  a2200109n  4500</leader>
<controlfield tag="001">10</controlfield>
   ...
<controlfield tag="005">20091210091717.0</controlfield>
        ...

私は最初に次のmysqlクエリを持っています:

UPDATE auth_header SET marcxml = UpdateXML(marcxml, '//controlfield[@tag="001"]', CONCAT('<controlfield tag="001">', '10', '</controlfield>')) WHERE Extractvalue(marcxml, '//controlfield[@tag="001"]') ='169625';

テーブルは auth_header であり、主キーとして authid があり (ただし、これは問題ではないと思います)、xml が格納される marcxml 列があります。クエリにより、「0 行が影響を受けました」と表示されます。だからうまくいかないようです。

よろしくお願いします。

4

1 に答える 1

0

ここの議論を見ると、MySQL は XML 属性を更新し、 mysql サイトhttps://dev.mysql.com/doc/refman/5.1/en/xml-functions.html#function_updatexml、クエリ:

UpdateXML(xml_target, xpath_expr, new_xml)

トリックを行う必要があります。

xml_target は、質問の場合は marcxml です。xpath_expr は '//controlfield[@tag="001"]' で、編集が必要なノードです。new_xml は concat 、必要な数字、および終了ステートメントです。最後に、where 式も上記の xpath 式と同じです。

したがって:

UPDATE auth_header SET marcxml = UpdateXML(marcxml, '//controlfield[@tag="001"]', CONCAT('<controlfield tag="001">', '10', '</controlfield>' )) WHERE Extractvalue(marcxml, '//controlfield[@tag="001"]') ='169625';
于 2015-10-06T09:01:17.110 に答える