2009-11-02 63 views
0

我最近接手了一個項目,有一個非常髒的數據庫...表「用戶」有一個「電話」列......問題是,該列保存多個電話號碼分隔「/ 」。我想把所有這些在不同的專欄(電話1,電話2,電話3等),但不知道什麼是最好的辦法。單獨使用MySQL可能嗎?我應該寫一些PHP腳本嗎?任何提示,將不勝感激......與MySQL拆分列

邁克

回答

4

如果您不確定每個記錄需要的電話號碼的數量,則可能需要一個電話號碼錶。你可能會更容易運行一個php腳本來更新數據庫(我假設你不會將你的電話號碼清理成特定格式並使用INNODB):

創建電話號碼錶:

CREATE TABLE `user_phone` (
    `userid` int(10) unsigned NOT NULL, 
    `phone` char(15) NOT NULL, 
    PRIMARY KEY (`userid`,`phone`), 
    CONSTRAINT `fk_user_phone_userid` FOREIGN KEY (`userid`) REFERENCES `users` (`userid`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

然後編寫一個php腳本來拆分現有的字段數據並在新表中創建插入。

編輯:正如我在評論下面提到的,你可以有,將仍然有電話號碼CONCAT一起向後compatable視圖,直到您可以更新的一切:

CREATE VIEW `old_table` AS 
    select `u`.*, group_concat(`up`.`phone` separator '/') AS `phone` 
    from `user_phone` `up` 
     left join `users` `u` on(`up`.`userid` = `u`.`userid`) 
    group by `u`.`userid` 
+0

這當然假設它不會破壞應用程序的其他層,例如報告,圖形用戶界面等。 – Kuberchaun 2009-11-02 22:25:26

+0

絕對。儘管可以創建一個視圖,爲bc創建電話列,直到所有內容都更新爲正常工作。 – 2009-11-02 22:27:07

+0

這就是我想要的......請試試看,謝謝;) – mike 2009-11-03 20:55:03

5

寫一個PHP腳本可能是你最好的選擇。

有沒有數量可能的電話號碼?如果是這樣,我只會爲他們製作新的專欄。如果沒有,我會創建一個新的電話號碼錶,其中包含一個用戶ID,並以這種方式關聯他們。 $

之後,只需查詢數據,並使用 $ phone_array = explode(「/」,$ phone_data);

然後開始將它們插回到數據庫中。

此外,您可以使用substring_index函數進行一系列查詢。

+0

這個答案的關鍵詞是「有限」,我完全同意。我會大膽的那個關鍵字:) – 2009-11-02 22:26:16

+1

如果它是> 2個數字,我會做一個新表,在我的眼裏添加phone_1,phone_2,...,phone_n和phone_1 /.../ phone_n一樣髒。特別是如果每​​個用戶的電話號碼數量不一致。 – phidah 2009-11-03 00:48:35

0

我肯定結束了書面方式是作爲腳本。

我喜歡把所有的電話號碼到一個新表完全的想法,但是否會有與性能或實現問題問題,這樣做的話,肯定的,離開領域PHONE1,PHONE2等

任何一種解決方案都會看起來像這樣..取決於您如何訪問數據庫,以及是否需要儘可能減少所有性能。

$query = "SELECT id, phone FROM users"; 
$result = $db->query($query); 
while ($row = $result->fetch_assoc()) { 
    $phones = array(); 
    $phones = explode('/', $row['phone']); 
    $i = 1; 
    foreach($phones as $p) { 
    if (strlen($p) >= 7) { 
     $row['phone'.$i] = $p; 
     $i++; 
    } 
    } 
    $upquery = "UPDATE users SET phone1='{$row['phone1}', phone2='{$row['phone2}', ... 
       WHERE id={$row['id'];"; 
    $result = $db->query($query); 
} 

我已經制定字符串長度測試,以防止奇碎片被保存電話號碼:

我可能會喜歡的東西而告終。在保存之前,您還可以使用一點正則表達式來增加每個電話號碼。

使其更快的方法是在同一查詢中運行多個更新。如果腳本超時,則可以限制每次執行影響的用戶行數並多次運行。