sql:如果另一列在命名空间中发生冲突,则更新列

时间:2014-01-17 17:42:02

标签: sql perl sqlite

我有一个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/erlanglang/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。如果需要,databaseavailable on ftp

1 个答案:

答案 0 :(得分:2)

要检查值是否在一组值中,请使用IN:

UPDATE categories
SET fullpkgpath = fullpkgpath || ',pkg'
WHERE fullpkgpath IN (SELECT value
                      FROM categories)