2016-03-08 25 views
0

這一點複雜,我解釋一下,我想我最好的。我有一個名稱爲引號的數據庫。在這個數據庫中我有四個表,其中兩個從其他數據庫導入。現在我想將這些表合併成2個表格。表格是author和author_new,引號和quotes_new。我想合併authors_new作者和quotes_new到引號,但問題是,它們之間存在着一定的關係像有每個作者的ID和此ID是與coloumn AUTH_ID給出的報價。如何合併在phpMyAdmin兩個表,從而不會有重複的條目?

與ID爲1的作者有10個或更多的報價,並且每個報價都AUTH_ID 1 現在如果我們合併來自author_new作者的ID將改變,因此在報價AUTH_ID也將發生變化,筆者用引號的關係不會保持。所以請給我建議一些答案,我可以合併數據也將維持關係。希望你明白我的問題。

這裏有瞭解情況

 author 

     id  | author_name | 
     ------------------------------------- 
     1   Jack 
     2   John  
     3   Jill 
     4   Mack 

     author_new 

    id  | author_name | 
    ------------------------------------>merge this in author 
    1   Harry 
    2   Micky  
    3   Jack 



     quotes 

     id  |quotes  | auth_id 
     ------------------------- 
     1   i love...  2 
     2   i am ..... 1 
     3   i was....  2 
     4   we are.... 3 


     quotes_new 

     id  |quotes  | auth_id 
     --------------------------------->merge this in quotes 
     1   we wil...  2 
     2   i am ..... 1 
     3   we know...  2 





     Result After merging 


    author 

    id  | author_name | 
    --------------------------------- 
    1   Jack 
    2   John  
    3   Jill 
    4   Mack 
    5   harry 
    6   Micky 


    quotes 

    id  |quotes  | auth_id 
    ------------------------- 
    1   i love...  2 
    2   i am ..... 1 
    3   i was....  2 
    4   we are.... 3 
    5   we wil... 5 
    6   i am ..... 6 
+0

我認爲你必須手動完成,如果你想保持關係,因爲它是 –

+0

你可以告訴我們4個表(不需要真實的數據),所以我們可以在mysql小提琴上做到這一點? –

+0

兄弟它沒有一個兩個條目其20個十萬報價和20萬作者..如何可能 –

回答

0

如果我們忽視的事實是「作者」可能是在兩個authorauthor_new表例如表,數據的遷移是非常簡單的,它只是包括一對夫婦要採取的步驟:

首先,創建其中將包含原始和新表中的所有數據中間表,這讓你有新的ID。

CREATE TABLE author_origin (
    id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
    originTable VARCHAR(16), 
    originId INT(11), 
    name VARCHAR(32), 
    PRIMARY KEY(id) 
); 
CREATE TABLE quotes_origin (
    id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
    originTable VARCHAR(16), 
    originId INT(11) UNSIGNED, 
    authorId INT(11) UNSIGNED, 
    quote VARCHAR(128), 
    PRIMARY KEY(id) 
); 

接下來,來自authorauthor_newauthor_origin和相同的報價表中的數據複製。

INSERT INTO author_origin (originTable, originId, name) 
SELECT 'author', id, name 
    FROM author; 
INSERT INTO author_origin (originTable, originId, name) 
SELECT 'author_new', id, name 
    FROM author_new; 

INSERT INTO quotes_origin (originTable, originId, authorId, quote) 
SELECT 'quotes', id, authorId, quote 
    FROM quotes; 
INSERT INTO quotes_origin (originTable, originId, authorId, quote) 
SELECT 'quotes_new', id, authorId, quote 
    FROM quotes_new; 

然後,你要創建的最終結構將要使用(我只是使用了相同的結構簡單,我從你的例子中提取)

CREATE TABLE author_final (
    id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
    name VARCHAR(32), 
    PRIMARY KEY(id) 
); 
CREATE TABLE quotes_final (
    id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
    authorId INT(11) UNSIGNED, 
    quote VARCHAR(128), 
    PRIMARY KEY(id) 
); 

現在,所有剩下的是將數據複製到「最終」表中。 作者是相當直接的(只跳過了「原點」字段)

INSERT INTO author_final 
SELECT id, name 
    FROM author_origin; 

的報價是稍微麻煩,因爲你需要引用新生成的AuthorID的

INSERT INTO quotes_final 
(SELECT q.id, a.id, q.quote 
    FROM quotes_origin q 
INNER JOIN author_origin a 
    ON a.originTable = 'author' AND a.originId=q.authorId 
WHERE q.originTable = 'quotes') 
UNION 
(SELECT q.id, a.id, q.quote 
    FROM quotes_origin q 
INNER JOIN author_origin a 
    ON a.originTable = 'author_new' AND a.originId=q.authorId 
WHERE q.originTable = 'quotes_new'); 

我創建一個working fiddle它做到這一點,這些步驟


當你回答我的評論相當多,而我是圍捕我的示例步驟,我會簡單介紹一下這個過程實際上合併authorauthor_new完全基於用戶名。

主要變化將是有中間author_originname領域是唯一的,並有原始表不同的領域,像

CREATE TABLE author_origin (
    id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
    name VARCHAR(32), 
    authorId INT(11) UNSIGNED, 
    authorNewId INT(11) UNSIGNED, 
    PRIMARY KEY(id), 
    UNIQUE KEY (name) 
); 

然後你會想更新相應的字段取決於始發表,例如

INSERT INTO author_origin (name, authorNewId) 
SELECT name, id 
    FROM author_new 
ON DUPLICATE KEY 
UPDATE authorNewId=id; 

從那時起,它僅僅是一個改變最終UNION查詢中的條件,使用適當的authorIdauthorNewId

不願建立新的小提琴,因爲我不欣賞清一色的事cap評論,仍然here's a working fiddle,這完全按照你如此雄辯的要求(你應該做正確的事情,並更新問題,以反映這個新的要求)。

+0

BUDDY如果作者具有相同的名稱是存在作者和作者_NEW –

+1

我建議你通讀到最後(並打帽大小鎖一次) –

+0

你可以請在MySQL的小提琴進行更改並得到確切的結果....是的最後一個查詢插入到quotes_final不顯示準確的結果只有quotes_new引號插入和其他引號沒有插入 –

相關問題