我有一个 SQL 表,其中包含包列表(10000 个唯一条目的顺序)以及任何给定包的相应类别(100 个唯一条目的顺序)。给定的包可以属于多个类别(15000 个唯一组合的顺序,这就是表的大小)。
所有包名称都应该是唯一的,并且不与类别名称冲突,但是,情况似乎并非如此。
我需要的是弄清楚这 10k 个包中是否有任何一个与 100 个类别中的任何一个具有相同的名称,如果是,则修改所有此类包名称以包含,pkg
后缀,以确保对两个命名空间的访问可以共享,并保持唯一。
最简单的情况是这样的:
sqlite> select * from categories where value=fullpkgpath;
lang/mono|lang/mono
sqlite> select fullpkgpath, value from categories where fullpkgpath="lang/mono";
lang/mono|devel
lang/mono|lang
lang/mono|lang/mono
应该转换成这样:
lang/mono,pkg|devel
lang/mono,pkg|lang
lang/mono,pkg|lang/mono
但是,也可能存在更间接的冲突(给定的包与其不属于的类别发生冲突),如下所示:
sqlite> select * from categories where fullpkgpath="lang/erlang" or fullpkgpath="lang/node";
lang/erlang|lang
lang/node|devel
lang/node|lang
lang/node|lang/python
应该转换成这样:
lang/erlang,pkg|lang
lang/node,pkg|devel
lang/node,pkg|lang
lang/node,pkg|lang/python
既然两者lang/erlang
and lang/node
它们本身也是类别:
sqlite> select * from categories where value="lang/erlang" limit 8;
databases/erl-Emysql|lang/erlang
databases/erl-couchbeam|lang/erlang
databases/erl-epgsql|lang/erlang
databases/erl-sqerl|lang/erlang
devel/erl-automeck|lang/erlang
devel/erl-bear|lang/erlang
devel/erl-depsolver|lang/erlang
devel/erl-ej|lang/erlang
sqlite> select * from categories where value="lang/node" limit 8;
databases/node-pg|lang/node
databases/node-sqlite3|lang/node
devel/node-async|lang/node
devel/node-bindings|lang/node
devel/node-buffer-writer|lang/node
devel/node-cloned|lang/node
devel/node-expresso|lang/node
devel/node-fibers|lang/node
我正在使用 sqlite3 和perl https://github.com/cnst/ports-readmes/blob/master/files/make-readmes在 OpenBSD 上。这database http://ports.su/databases/sqlports,如果需要的话,是可在 ftp 上找到 ftp://ftp.nluug.nl/pub/OpenBSD/5.4/packages/amd64/sqlports-compact-2.8.tgz.