BerkeleyDB同名key值(Duplicate Key)的使用

 
查看文章
  
BerkeleyDB同名key值(Duplicate Key)的使用
2008年07月16日 星期三 22:31
以下言论为菜鸟乌焦巴弓之拙见,可信度最多达到百分之八十,如有被该文引入歧途者请冷静点,臭鸡蛋滴不要带。请高手帮忙点错,万分感谢!
首先,我们要知道一个概念:duplicate keys,也就是说:在同一个库中多条记录共享一个key。在建库的过程中,如果存在多条同名的记录对应不同data时,就要用到这个东东了。例如某公司 职工数据库里,以员工的名字作为记录的key,同时有好几个名叫Jackey的员工,这时就要用到同名key值的概念了。
注意:duplicate keys只能在二进制树以及hash表格式的库中。
启用duplicates应该在建立数据库的时候用DB->set_flags()来设置。有DB_DUP及DB_DUPSORT两种标志。前者不 使数据库duplicate keys自动排列,而后者利用DB->set_dup_compare()指定排列函数后,支持自动排列功能,该排列函数的格式为: int (*function)(DB *db, const DBT *key1, const DBT *key2); `
看一个代码片段:
DB *dbp;
DBC *cursor;
DBT key, data;

db_create(&dbp, NULL, 0);
dbp->set_flags( DB_DUP);//或者DB_DUPSORT
dbp->open( NULL, file_name, NULL, DB_BTREE, DB_CREATE, 0);

这样,新键的数据库就有对duplicate keys的支持。

支持duplicate key的库的写入与一般的库没有什么区别,用DB->put写入时,记录会被排在库的最后;
dbp->put(dbp, NULL, &key, &value, 0);//flag不可为DB_NOOVERWRITE
当用DBC->put()写入时,可以用到下面几个用于加入duplicate记录的标志宏:
DB_BEFORE;DB_AFTER //当前加入记录的key与游标当前指向的记录的key一致。直接将该记录作为duplicate记录加到当前记录的前/后面。当库的标志为DB_DUPSORT时,该标志无用。
DB_KEYFIRST;DB_KEYLAST //如果该记录的key值在库中已经存在,且库的定义为DB_DUP(即不自动分类)时,该记录被加到所属key的duplicate列表的最前/后面。

需要说明的是,带duplicate keys支持的库,当你用普通的DB->get()来读取记录的时候,取得的是指定key值对应的第一个data,要取得后面一些data的时候,需要用到游标DBC->c_get。请看下面的代码片段:
DB *dbp;
DBC *cursor;
DBT key, data;

db_create(&dbp,NULL, 0);
dbp->open(NULL, file_one, NULL, DB_HASH, DB_CREATE, 0);
dbp->cursor(NULL, &cursor, 0);
/***对key与value进行初始化空间***/
cursor->c_get(cursor, &key, &value, DB_SET); //游标指到第一个符合key值的记录。
cursor->c_get(cursorp, &key, &data, DB_NEXT_DUP); //查找下一个该key对应的记录。
这里有几个c_get常用的flag:
DB_SET; //游标指向第一个符合key的记录。
DB_SET_RANGE; //支持模糊查找,游标指向第一个大于等于key值的value
DB_NEXT; DB_PREV; //下/上一条记录(将duplicate记录也作为记录看待)
DB_GET_BOTH;//前者游标指向key、value值都匹配的记录;
DB_GET_BOTH_RANGE; //后者支持模糊查找,游标指向与key、value值最接近的第一条记录。
DB_NEXT_NODUP; DB_PREV_NODUP; //下/上一条记录(将duplicate排除在外)
DB_NEXT_DUP;//下一条duplicate记录。

删除duplicate key记录:
当你用普通的DB->del()来删除某条记录的时候,如果该库是带duplicate key支持的,并且你在函数中指定的key值又恰好对应着多个data(即duplicate组),那么你这个操作将把这个duplicate组中所有记录全部删除.
如果这种结果不是你真正想要的,那为了避免这种情况,你必须使用游标的方法才能指向该key值对应的duplicate组中的其它记录,然后进行删除.e.g:
DBC *cursor;
DB *dbp;
DBT *key, *value;

/*****打开/设置库语句省略号*******/
dbp->set_flags(dbp, DB_DUP);
key.data = “xxx”;
key.size = strlen(“xxx”);
value.data = “yyy”;
value.size = strlen(“yyy”);

cursor->c_get(cursor, &key, &value, DB_GET_BOTH);
cursor->c_del(cursor, 0);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值