我最近接手了一個項目,有一個非常髒的數據庫...表「用戶」有一個「電話」列......問題是,該列保存多個電話號碼分隔「/ 」。我想把所有這些在不同的專欄(電話1,電話2,電話3等),但不知道什麼是最好的辦法。單獨使用MySQL可能嗎?我應該寫一些PHP腳本嗎?任何提示,將不勝感激......與MySQL拆分列
邁克
我最近接手了一個項目,有一個非常髒的數據庫...表「用戶」有一個「電話」列......問題是,該列保存多個電話號碼分隔「/ 」。我想把所有這些在不同的專欄(電話1,電話2,電話3等),但不知道什麼是最好的辦法。單獨使用MySQL可能嗎?我應該寫一些PHP腳本嗎?任何提示,將不勝感激......與MySQL拆分列
邁克
如果您不確定每個記錄需要的電話號碼的數量,則可能需要一個電話號碼錶。你可能會更容易運行一個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`
寫一個PHP腳本可能是你最好的選擇。
有沒有數量可能的電話號碼?如果是這樣,我只會爲他們製作新的專欄。如果沒有,我會創建一個新的電話號碼錶,其中包含一個用戶ID,並以這種方式關聯他們。 $
之後,只需查詢數據,並使用 $ phone_array = explode(「/」,$ phone_data);
然後開始將它們插回到數據庫中。
此外,您可以使用substring_index函數進行一系列查詢。
這個答案的關鍵詞是「有限」,我完全同意。我會大膽的那個關鍵字:) – 2009-11-02 22:26:16
如果它是> 2個數字,我會做一個新表,在我的眼裏添加phone_1,phone_2,...,phone_n和phone_1 /.../ phone_n一樣髒。特別是如果每個用戶的電話號碼數量不一致。 – phidah 2009-11-03 00:48:35
我肯定結束了書面方式是作爲腳本。
我喜歡把所有的電話號碼到一個新表完全的想法,但是否會有與性能或實現問題問題,這樣做的話,肯定的,離開領域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);
}
我已經制定字符串長度測試,以防止奇碎片被保存電話號碼:
我可能會喜歡的東西而告終。在保存之前,您還可以使用一點正則表達式來增加每個電話號碼。
使其更快的方法是在同一查詢中運行多個更新。如果腳本超時,則可以限制每次執行影響的用戶行數並多次運行。
這當然假設它不會破壞應用程序的其他層,例如報告,圖形用戶界面等。 – Kuberchaun 2009-11-02 22:25:26
絕對。儘管可以創建一個視圖,爲bc創建電話列,直到所有內容都更新爲正常工作。 – 2009-11-02 22:27:07
這就是我想要的......請試試看,謝謝;) – mike 2009-11-03 20:55:03