在MySQL中我们可以使用xml来存储查询更新数据,她的优点为我们可以更合理的规划数据,比如一个字段需要存储多个关系时,我们以前一般新建一张关联表,但使用xml即可一张表就能完成关联。但是xpath也有很大的缺点,他会导致cpu使用率的上升。
    MySQL在5.1.5这个版本中开始支持xml字符串。使用XPath 1.0 语法。

 

示例:

1.首先我们创建一张表,他有id,pid,cids三个字段

CREATE TABLE IF NOT EXISTS `article` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '文章编号',
`pid` int(11) NOT NULL COMMENT '文章栏目',
`cids` varchar(200) NOT NULL COMMENT '附加栏目',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='文章表' ;

2.插入一些数据

INSERT INTO `test`.`article` (`id`, `pid`, `cids`) VALUES 
(NULL, '1', '<cids><cid>3</cid><cid>4</cid></cids>'),
(NULL, '1', '<cids><cid>4</cid><cid>5</cid></cids>'),
(NULL, '2', '<cids><cid>3</cid><cid>4</cid></cids>'),
(NULL, '2', '<cids><cid>5</cid><cid>8</cid></cids>');

3.MySQL XPath相关函数介绍

ExtractValue() ----- (查询方法)提取一个值从一个XML字符串使用XPath符号

有两个字符串参数,
第一个参数:XML标记,文档对象的名称,也就是键名
第二个参数:XPath表达式

UpdateXML() ----- 修改方法

有三个字符串参数
第一个参数:XML标记,文档对象的名称,也就是键名
第二个参数:XPath表达式
第三个参数:String格式,替换查找到的符合条件的数据

4.查询数据示例

 查询栏目为3的文章
SELECT id FROM article where EXTRACTVALUE(cids,'/cids/cid[self:text()="3"]') OR pid=3;
查询附加栏目为8的数据(可利用索引)
SELECT id FROM article where EXTRACTVALUE(cids,'/cids/cid[self:text()="8"]')

5.更新数据示例

 在内存中将cid=8更改为cid=9并返回
select UpdateXML(cids,'/cids/cid[self:text()="8"]','<cid>9</cid>') from article limit 1
彻底更改并返回
UPDATE article SET cids = UpdateXML(cids,'/cids/cid[self:text()="8"]','<cid>9</cid>');