2013-07-23 41 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