2012-07-23 69 views
0

我在不同數據庫中有兩個類似的表,我想從另一個數據庫中插入一個。同時,我希望確保每次mySql遇到「重複id」錯誤時,都會將該行插入新表的底部,並指定一個新的唯一標識。我曾嘗試過:
INSERT...SELECT...ON DUPLICATE KEY UPDATE
但我找不到一種方法來讓它插入到一個新行,如果它找到'重複鍵'而不是更新前一行。在不更新舊行的情況下插入唯一行

+0

'鍵'是自動增量值嗎?如果是這樣,我可能會爲你解決。嘗試'INSERT INTO table2'SELECT NULL,col1,col2,col3 FROM table1'我手邊沒有準確的語法,但它應該以這種方式工作。 – ATaylor 2012-07-23 13:36:35

+0

是'鑰匙'是一個自動增量字段。謝謝,我會試試這個。 – IROEGBU 2012-07-23 13:40:07

+0

不客氣。這聽起來很高興,如果你得到它的工作:) – ATaylor 2012-07-23 13:42:50

回答

2

如果你可以指定新id到每一條記錄被複制到目標表,無論在源表中的id是否在目的地以前存在與否,你根本無法提供id,讓MySQL來訴諸要分配默認NULL值導致auto_increment值:

INSERT INTO destdb.tbl (colA, colB, colC) 
SELECT colA, colB, colC 
FROM srcdb.tbl 

否則,你將需要使用像NULLIF()明確設置idNULL它已經存在,基於連接表一起:

INSERT INTO destdb.tbl (id, colA, colB, colC) 
SELECT NULLIF(src.id, dst.id), src.colA, src.colB, src.colC 
FROM srcdb.tbl src LEFT JOIN destdb.tbl dst USING (id) 
+0

嗯,我不知道NULLIF。我會盡力記住它,如果我需要這樣的東西。 +1 – ATaylor 2012-07-23 14:44:48

+0

@ATaylor:在MySQL中有很多方便的功能被隱藏起來;在火車上無聊時花費一個小時瀏覽手冊頁是非常值得的。爲我節省了很多痛苦! :) – eggyal 2012-07-23 15:05:14

+0

是的,我確切地知道你的意思:)不幸的是,與互聯網接入的「火車遊樂設施」對我來說非常罕見:D – ATaylor 2012-07-23 15:09:53

1

據當時http://dev.mysql.com/doc/refman/5.1/de/insert-select.html的文檔,這可能與查詢來實現:

INSERT INTO `table2` SELECT (NULL, col1, col2, col3) FROM `table1` 

這種方式,自動增量值是留給「NULL」,導致發動機給它是一個新的AI值,而不是試圖強制現有的AI值。

請不要讓我的語法,我沒有測試過這個。

0
If the id is autoincrement: 
Create an additional column in the second table with a reference to the id value in the first table 
Sample Select Query: 

SELECT unique_id, data FROM table_1 WHERE id='$id' 

Sample Insert Query: 

INSERT INTO table_2 (table_1_unique_id, data) VALUES ($unique_id_from_first_table, $data) 

This will solve any duplicate id problems and allow referencing between the two tables 
相關問題