2012-08-01 101 views
0

我想使用'insert into'mysql命令將table1內容移動到table2,但是table2可能具有'相同'主鍵。我想在執行insert語句時將table2的記錄(具有相同的主鍵)替換爲table1的記錄。我可以使用'或替換'來實現這一點嗎?從表1中插入或替換到表2中

+1

'重複的主鍵'是有點矛盾...... – 2012-08-01 15:56:17

+0

@MarcB我認爲他的意思與表1的主鍵重複 – 2012-08-01 15:57:38

+0

我會'相同',而不是重複尊重英語。 – alrightgame 2012-08-01 15:59:10

回答

2

使用一個INSERT ... SELECT與對重複KEY UPDATE子句:

INSERT INTO table2 
    SELECT * FROM table1 ON DUPLICATE KEY UPDATE table2.field1 = table1.field1 

使用*爲了簡潔,但UPDATE子句中你必須單獨指定字段,應該這麼做插入和選擇子句也是如此。

+0

那麼當你試圖在每個表中插入'like'主鍵時,mysql會做什麼?它會拋出一個錯誤嗎? – alrightgame 2012-08-01 16:07:55

+0

當你說「like」時,你的意思是重複的?然後通常是的;但它取決於您的服務器所處的模式。「ON DUPLICATE KEY」子句可以通過告訴服務器執行更新而不是拋出錯誤來規避該錯誤。 – 2012-08-01 16:15:51

3

嘗試是這樣的(不知道您的具體模式,這隻能是一個例子)

INSERT INTO tbl_a (a,b,c) 
SELECT a,b,c FROM tbl_b 
ON DUPLICATE KEY UPDATE b = tbl_b.b, c = tbl_b.c 

從文檔爲INSERT on DUPLICATE

如果指定了對重複密鑰更新,和行被插入,這會在UNIQUE索引或PRIMARY KEY中產生重複值,執行舊行的更新

0

如果在表2是在表1鍵重複的主鍵不被其他地方的外鍵稱,最簡單的方法是使用REPLACE ... INTO

「REPLACE作品酷似INSERT,不同之處在於,如果一個老表中的行與PRIMARY KEY或UNIQUE索引的新行具有相同的值,則在插入新行之前刪除舊行。「

所以,你會做這樣的事情:

REPLACE INTO table2 (a, b, c) 
SELECT a, b, c FROM table1; 

它將table2爲你的鑰匙,所以任何行挑選出具有相同ID作爲table1一排由table1的覆蓋行數據。

+0

這真的取決於是否有外鍵在這裏使用 - 如果有和他們正在使用級聯刪除 - 然後好關聯的數據...這是因爲'替換...到'刪除然後插入 – ManseUK 2012-08-01 16:21:22

+0

已編輯爲了體現這一點,謝謝。 – 2012-08-01 16:24:20