2013-07-30 73 views
1

我試圖在MySQL上用最新產品填充產品表,這些產品已檢索並存儲在products_temp表中。 所以對於這種方法是簡單的,簡單地做一個INSERT從products_temp產品,例如:SQL從源表中通過重複主鍵防止從表插入

INSERT INTO products (select products_temp.* FROM products_temp) 

問題是,它會導致重複的主鍵錯誤,因爲從products_temp與衝突的id產品中的id。

有人能告訴我如何解決這個問題嗎?

我想宣佈在SELECT語句中的字段沒有ID,但導致「列數在1行不匹配值計數」

任何幫助,將不勝感激。

謝謝!

+0

只能將產品??? –

+0

你想如何解決它?你想分配新的ID,還是跳過現有的ID? PK是一個自動編號字段嗎? – GolezTrol

+0

Doees的products_temp包含整個產品或者只是增量更新? –

回答

3

你需要聲明除了在INSERTSELECT兩個ID列,因爲字段的數量需要匹配,並id(如你注意到)不能作爲插入到是目標表。

INSERT INTO DestTable (field1, field2, field3) 
    SELECT field1, field2, field3 FROM SourceTable; 

An SQLfiddle to test with

編輯:你可能做一個更簡單的方法來簡化插入。您可以創建一個觸發器,只需在插入時強制主鍵爲NULL

CREATE TRIGGER t_DT BEFORE INSERT ON DestTable 
FOR EACH ROW 
    SET NEW.id = NULL; 

然後從表格到表格的副本可以簡單地完成;

INSERT INTO DestTable SELECT * FROM SourceTable; 

Another SQLfiddle

+0

不幸的是,這似乎是解決這個問題的唯一方法。只是有點麻煩列出了46個字段的名稱x 2,希望有一個更優雅的解決方案.. :( – Winterain

+0

你認爲如果我使用腳本語言(在這種情況下,PHP)來執行插入呢?我會仍然必須申報所有的字段名稱(排除id),但只有一次.. – Winterain

+1

@Winterain增加了一個替代方案。 –

0

如何是這樣的:從誰目前並不存在於產品溫度

INSERT INTO products 
( 
    select products_temp.* FROM products_temp 
    where key not in (select key from products) 
) 
+0

nada,那會使用衝突的ID忽略來自products_temp的所有行,但實際上需要添加products_temp中的所有結果。 – Winterain

+0

我猜你想要避免的是一個身份列的插入,這恰好是主鍵。你的問題陳述是你試圖避免主鍵衝突。 – Metaphor