2013-07-23 126 views
0

我在数据库中有一张表,用于存储可从服务器上检索图像文件的名称。删除具有类似名称的数据库重复项

表说明如下:

+------------+-----------------+------+-----+-------------------+-------+ 
| Field  | Type   | Null | Key | Default   | Extra | 
+------------+-----------------+------+-----+-------------------+-------+ 
| id   | varchar(50)  | NO | PRI | NULL    |  | 
| userid  | varchar(8)  | NO |  | NULL    |  | 
| albumid | varchar(25)  | NO |  | NULL    |  | 
| image_name | varchar(256) | NO |  | NULL    |  | 
| status  | int(1) unsigned | NO |  | NULL    |  | 
| comments | varchar(4000) | YES |  | NULL    |  | 
| mod_date | timestamp  | NO |  | CURRENT_TIMESTAMP |  | 
+------------+-----------------+------+-----+-------------------+-------+ 

我有扫描新文件的图像文件夹并将它们添加到数据库中的一个单独的PHP脚本。 但是,试图更新数据库的人员会删除所有文件夹(针对每个用户标识和albumid ...)以及所有旧图像,并使用新名称重新创建具有一组新图像的所有文件夹。

这样做会使网站显示旧图像集的破碎图片链接,但会显示所有的状态和评论,而新图像集正确显示但没有存储状态和评论信息。

超出了表格中的所有字段。表格中唯一标识新旧区域的字段是id,mod_date(均自动生成)和image_name

图像名称都共享相同的字符串,但预先添加了不同的路径信息。

实施例:

旧图像名称:XXX_02420624_20100308-00231_A.png

新图像名称:YYY_02420624_20100308-00231_A.png

注意02420624_20100308-00231_A.png正在新旧共享具有不同预会挂起。

我的问题是,如果不是所有的专辑都被更新(即使所有用户和所有专辑的所有文件夹都被删除然后再添加回来,但并非所有文件都有新文件名),什么是消除这些重复数据的最有效方法,并且仍然保留为每个图像分配的注释和状态?

我想我可以删除图像的新行并将旧图像名称重命名为新图像,以便它正确指向正确的图像并仍保留状态/注释。但是,如何编写一个搜索自动存储在数据库中的新图像的通用脚本?

编辑:新加入的图像名称具有

yyy_userid_albumid_AAA.png

的格式,其中yyy是所有新图像,useridalbumid预挂起相同的几乎不言自明,并且AAA是唯一的图像名称。

因为我知道xxxyyy都是常数,我可以写一个PHP脚本,通过数据库自动查找并删除与yyy开始IMAGE_NAME条目,然后更改xxxyyy,使图像点走向正确的道路,仍然保留着地位和评论。我的问题是:你怎么能写一个脚本,只在'image_name'字符串中搜索pre-pend,直到它遇到8位userid(从0开始)?

+0

你尝试过这一点?或者至少你有什么想法可以解决这个问题? –

+0

因为我知道xxx和yyy都是常量,所以我可以在php中编写一个脚本,它会自动查看数据库并删除以yyy开头的image_name条目,然后将xxx更改为yyy,以便图像指向右侧路径并仍然保留状态和评论。我的问题是:如何编写一个只在'image_name'字符串中搜索pre-pend的脚本,直到它遇到8位数的用户标识符(以0开头)? – alchuang

回答

1

好像您需要将新名称链接到旧图像的记录。

下面的SQL应该用新的图像名称更新所有旧'xxx'图像的图像名称。然后,您将不得不删除(有YYY前缀的)添加了新的记录

(未经测试)

update the_table t 
set t.image_name = 
(select COALESCE(t2.image_name,t.image_name) 
from the_table t2 
where = t2.image_name = 'yyy' || substring(t.image_name,<size of xxx>)) 
+0

你能否在括号中说明你的代码? '(从the_table T2 其中子(t.image_name,)=子(t2.image_name选择t2.image_name ,) 和t2.image_name = 'YYY' ||子(t2.image_name,))' where substring = substring,我认为这些将是相同的? – alchuang

+0

我稍微修改它以删除该过滤器。让我知道现在是否更有意义。如果新版本不存在,合并将使用t.image_name(旧)。 – dseibert

+0

感谢您的帮助!我了解该声明的总体思路,但也存在一些错误。 '在哪里t2.image_name ='yyy''而不应该'|| (或)'而不是一个附加? – alchuang