我有一个SQL表,其中包含软件包列表(10000个唯一条目的顺序)和任何给定软件包的相应类别(100个唯一条目的顺序)。给定的包可以属于多个类别(15000个唯一组合的顺序,因此是表的大小)的一部分。
所有软件包名称都应该是唯一的,并且不会与类别名称冲突,但是,情况似乎并非如此。
我需要确定10k软件包中的任何一个是否与100个类别中的任何一个都具有相同的名称,如果是,请对所有此类软件包名称进行修改以包含,pkg后缀,以确保可以共享对两个名称空间的访问,并保持独特。
,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和lang/node本身都是类别,因此:
lang/erlang
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
我在OpenBSD上使用sqlite3和perl。如果需要,该数据库可在ftp上找到。
要检查一个值是否在一组值中,请使用IN:
UPDATE categories SET fullpkgpath = fullpkgpath || ',pkg' WHERE fullpkgpath IN (SELECT value FROM categories)