2014-09-30 39 views
0

我遷移舊的數據庫中的數據到一個新的,他們用於存儲的格式如下電話號碼:

例1:剖分式VARCHAR領域有許多價值,並插入分別

41.9044-9082;41.9044-9661;41.9851-9862;41.9984-0393;41.3399-9169;41.3997-7999; 

實施例2:

41.3369-0102;41.8928-5992; 

否電話(空):

; 

如何將這些具有多個值的單個VARCHAR字段拆分並分別插入它們?它是如何

表例如:我怎麼會喜歡它

|#id_tel#|### number ####|#|client_id|#| 
|# 1 #|111163;3554353;|#| 2  |#| 
|# 2 #|222222;  |#| 3  |#| 
|# 3 #|;    |#| 4  |#| 

表例子是:

|#id_tel#|### number ####|#|client_id|#| 
|# 1 #|111163   |#| 2  |#| 
|# 2 #|3554353  |#| 2  |#| 
|# 3 #|222222   |#| 3  |#| 
+0

幾個問題:你想更新回同一張表還是複製到另一張表?它是否必須在MySQL中,或者你是否可以編寫腳本(PERL,PHP等)你處理了多少行? – Don 2014-09-30 21:09:11

回答

1

你可以做到這一點與SUBSTRING_INDEX的嵌套調用()和一個數字表。在我的例子中,我創建了數字表格,最多可以創建100個數字。

假設表old_tel具有以下CREATE TABLE語句:

CREATE TABLE old_tel (
    id_tel INT, 
    `number` VARCHAR(200), 
    client_id INT 
); 

你與此查詢的CLIENT_ID獲得分割後的數字:

SELECT 
     SUBSTRING_INDEX(SUBSTRING_INDEX(`number`, ';', n.n), ';', -1) value, 
     client_id 
    FROM 
     old_tel 
    CROSS JOIN (
     SELECT 
      1 + a.N + b.N * 10 AS n 
     FROM 
      (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a 
      ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b 
     ORDER BY n  
) n 
    WHERE 
     n.n <= LENGTH(`number`) - LENGTH(REPLACE(`number`, ';', '')) 
    AND 
     SUBSTRING_INDEX(SUBSTRING_INDEX(`number`, ';', n.n), ';', -1) <> '' 
    ORDER BY 
    client_id, SUBSTRING_INDEX(SUBSTRING_INDEX(`number`, ';', n.n), ';', -1); 

假設你的新的電話號碼錶看起來幾乎相同:

CREATE TABLE new_tel (
    id_tel INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    `number` VARCHAR(200), 
    client_id INT 
); 

您可以填寫此表■簡單INSERT語句中使用的第一個查詢:

INSERT INTO new_tel (`number`, client_id) 
    SELECT 
     SUBSTRING_INDEX(SUBSTRING_INDEX(`number`, ';', n.n), ';', -1) value, 
     client_id 
    FROM 
     old_tel 
    CROSS JOIN (
    SELECT 
     1 + a.N + b.N * 10 AS n 
    FROM 
     (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a 
     ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b 
    ORDER BY n  
) n 
    WHERE 
    n.n <= LENGTH(`number`) - LENGTH(REPLACE(`number`, ';', '')) 
    AND 
    SUBSTRING_INDEX(SUBSTRING_INDEX(`number`, ';', n.n), ';', -1) <> '' 
    ORDER BY 
    client_id, SUBSTRING_INDEX(SUBSTRING_INDEX(`number`, ';', n.n), ';', -1); 

說明

內再選擇與UNION ALL創建於飛號碼錶。我們將這限制在number列中的子字符串數量並過濾掉空值。

SUBSTRING_INDEX(SUBSTRING_INDEX(`number`, ';', n.n), ';', -1) value 

刪除用分號分隔的第n個數字。

看本Demo

**注意工作:**這是非常快的,通過行插入,避免痛苦的一行。

+0

你的答案真的很詳細,完整!非常感謝你!!!!!!!! – BernardoLima 2014-09-30 21:54:23

+0

不客氣! – VMai 2014-09-30 21:55:09