2017-08-16 27 views
0

我正嘗試將數據從一個表遷移到同一個數據庫中的另一個表。問題是我從中導入的表中的記錄可能有不同的數據,但包含主鍵的相同自動遞增ID,因此當我嘗試導入它時,它顯然說它由於重複而無法寫入鍵。當檢測到重複時,將auto_increment id替換爲下一個空閒標識

我試着做下面的查詢,以避開這個:

INSERT INTO my_table SELECT * FROM my_temp_table ON DUPLICATE KEY UPDATE my_table.LogID=LAST_INSERT_ID(my_table.LogID); 

該查詢似乎工作和MySQL表示,它已經寫10000行的表,但它實際上沒有。

如何從my_temp_table插入所有行,但插入的唯一自動遞增ID?按要求對錶更

UPDATE

有點信息。兩個表格顯然都是相同的定義。該表包含一個LogID(這是自動增量主鍵),一個時間戳和其他一些字段。數據庫表中包含7月1日至3日的一些時間戳,但不是應有的所有內容。

有具有正確信息的舊的數據庫服務器,所以我做

CREATE TABLE my_temp_table LIKE my_table

然後導入1日至7月3日到本我的臨時表像這樣

INSERT INTO my_temp_table SELECT * FROM my_table WHERE Date BETWEEN '2017-07-01' AND '2017-07-03' 

這然後mysqldump'ed並複製到新的服務器並導入。

在新的服務器然後我刪除了從1日至7月3日的所有記錄如下:

DELETE FROM my_table WHERE Date BETWEEN '2017-07-01' AND '2017-07-03' 

現在我需要從我的temp_table得到的7月1日至3日的數據爲MY_TABLE所以數據庫擁有它在這兩個日期之間所需的所有信息。

由於my_table在7月的原因中插入了其他記錄,並且舊服務器在7月份的前3天內正常工作,因此舊服務器添加了更多數據,因此舊服務器記錄具有與新服務器衝突的auto_increment ID我需要將這些行從舊服務器導入到新服務器,但確保日誌ID是新的,因此可以插入。

+0

我已經添加了更多信息來解釋我正在努力實現 – Boardy

回答

-3

我會爭辯說,兩個源表的自動增量主鍵不應該與共享目標列的自動增量列有關。如果您希望保留原始主鍵,則可以在非唯一列中進行。

+0

Downvoter:請留下一個理由。沒有我說的是不正確的,並減去一些實際的代碼,這是一個可行的答案。 –

0

大概你不關心你的新表中的行是否與你舊錶中的行有相同的自動增量id值。

在這種情況下,讓MySQL生成新的id值,像這樣。

INSERT INTO my_table 
      (col2, col3, col4, col5) 
    SELECT col2, col3, col4, col5 
     FROM my_temp_table 

在列名的列表(col2, col3, col4, col5在我的例子)沒有提及自動增量列。然後,MySQL將正確地生成其值,但使用新的值序列。

如果您想按照特定順序爲這些行創建新的自動增量序列,可以使用ORDER BY子句來實現。

使用LAST_INSERT_ID()你在你的例子中的做法將無法正常工作。

+0

啊,這是有道理的。我會給你一個解決方案 – Boardy

+0

最後一句話:如果你想解釋_why_它沒有用,這會更有幫助,那不是OP問這個問題的原因 – inetphantom

+0

當你使用這個解決方案時,你有問題(按設計)主鍵不對應於時間軸。例如,如果您選擇(默認情況下按主要順序排列),您將擁有如下內容:'1,2,3,8,9,4,5,6,'。 (雖然從1到9會按時間順序排列) – inetphantom

0

如果您需要主鍵對應於時間軸,則表示最早的條目 - >最低鍵,然後按照這些步驟操作。

我作爲開發人員永遠不會期望,如果我選擇按主要順序的條目將按時間順序混亂。

  1. Incrase所有的縫隙後的按鍵

    UPDATE my_table SET primary = primary + 1000 WHERE Date BETWEEN '2017-07-01' AND '2017-07-03'

  2. 插入他們的鑰匙(或鑰匙翻譯)

    INSERT INTO my_table SELECT * FROM my_temp_table

  3. Incrase汽車臨時項如描述的增量值here

+0

如果您不包括ORDER BY,或者有一個CLUSTERED KEY,那麼不要期望任何排序順序。 –

+0

@KamilG。我想說的是,我們生活在一個骯髒的世界,如果一些懶惰的人沒有適當地使用日期和時間,但99%的主要工作和良好。所以我的嘗試是不制動這個命令以避免意外。 – inetphantom