有没有办法删除键值对,其中键以子字符串1开头,在BerkeleyDB中以子字符串2结尾而不遍历数据库中的所有键?
例如:
$ sub1 =“B015”;
$ sub2 =“5646”;
我想删除
$ key =“B015HGUJJ75646”
注意:保证$ sub1和$ sub2的组合只有一个键。
这可以通过获取DB的迭代器并检查条件的每个键来完成,但这对于大型DB来说非常低效。有没有办法在没有遍历整个数据库的情况下做到这一点?
答案 0 :(得分:1)
如果您正在使用RECNO数据库,那么您可能运气不好。但是,如果你可以使用BTREE,你有几个选择。
首先,也许最简单的方法是只迭代有意义的数据库部分。假设您正在使用默认密钥比较函数,则可以使用DB_SET_RANGE将起始光标(迭代器)定位在部分密钥字符串的开头。在您的示例中,这可能是"B0150000000000"
。然后使用DB_NEXT向前扫描,依次查看每个键。当您找到要查找的密钥时,或者如果您找到的密钥不是以"B015"
开头,那么您就完成了。
另一种适用于您的情况的技术是重新定义关键比较功能。如果你说,只有$ sub1和$ sub2的组合,那么你可能只需要比较这些键的部分以保证唯一性?以下是https://www2.informatik.hu-berlin.de/Themen/manuals/perl/DB_File.html的完整字符串比较示例(我假设您正在使用perl,仅使用上面提供的语法):
sub Compare
{
my ($key1, $key2) = @_ ;
"\L$key1" cmp "\L$key2" ;
}
$DB_BTREE->{compare} = 'Compare' ;
所以,如果你可以装备的东西只是比较起始和结束的四个字符,你应该能够将数据库迭代器直接放到你感兴趣的密钥上。