删除具有相似名称的数据库副本

时间:2013-07-23 20:31:41

标签: php mysql

我在数据库中有一个表,用于存储可以从服务器上检索它们的映像文件的名称。

表格描述如下:

+------------+-----------------+------+-----+-------------------+-------+
| 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脚本,它扫描图像文件夹中的新文件并将它们添加到数据库中。 但是,尝试更新数据库的人删除了所有文件夹(对于每个userid和albumid ...)以及所有旧图像,并使用一组带有新名称的新图像重新创建了所有文件夹。

这使得网站显示旧图像集的损坏图片链接,但其中包含所有状态和注释,而新图像集正确显示但没有存储状态和评论信息。

表格中的所有字段。表格中唯一告诉旧区和新区的字段是idmod_date(都是自动生成的)和image_name

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

示例:

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

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

请注意,02420624_20100308-00231_A.png由具有不同pre-pends的旧版和新版共享。

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

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

编辑:新添加的图片名称格式为

  

yyy_userid_albumid_AAA.png

其中yyy是所有新图片的预挂图相同,useridalbumid几乎是不言自明的,AAA是唯一的图片名称。< / p>

由于我知道xxxyyy都是常量,我可以在php中编写一个脚本,自动查看数据库并删除以yyy开头的image_name的条目然后将xxx更改为yyy,以便图片指向正确的路径并仍然保留状态和评论。我的问题是:你如何编写一个脚本,只在“image_name”的字符串中搜索pre-pend,直到它达到8位userid(以0开头)?

1 个答案:

答案 0 :(得分: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>))