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

这使得网站显示旧图像集的图片链接损坏,但所有状态和评论都在那里,而新图像集正确显示,但没有存储状态和评论信息。

在表中的所有字段中。表中唯一区分新旧的字段是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前置都相同,userid并且albumid几乎不言自明,并且AAA是唯一的图像名称。

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

4

1 回答 1

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>))
于 2013-07-23T21:47:06.167 回答