2014-03-13 129 views
1

我只想將不匹配的值從table2(tpl2)複製到tpl1。什麼是正確的語法來做到這一點?我使用「更新內連接」,但從tpl1刪除值。我應該使用插入選擇嗎?參見下文:用另一個更新mysql表

tpl1  tpl2    tpl1 
------ -------   ------- 
col_1  col_1   col_1 
1   1  --->  1 
2   2    2 
3   3    3 
4   4    4 
      5    5 
      6    6 
      7    7 

回答

1

你可以用insert . . . select做到這一點:

insert into tpl1(col1) 
    select col_1 
    from tpl2 
    where not exists (select 1 from tpl1 where tpl1.col_1 = tpl2.col2); 

如果你想避免重複,您也可以考慮這種方式。在tpl1(col_1)創建唯一索引或約束:

create unique index tpl1(col_1); 

然後簡單地忽略已存在的任何值。使用on duplicate key update無視這種方法:

insert into tpl1(col_1) 
    select col_1 
    from tpl2 
    on duplicate key update col_1 = tpl1.col_1; 

的分配不會改變表,所以結果是重複被忽略。

+1

存在價值,我認爲你的更新查詢是錯誤的做到這一點,她(@ user3247935)不想顯示輸出就像你的代碼,你應該看到這個帖子的輸出[問題]。你的輸出就像(** http://sqlfiddle.com/#!2/53a5b/1 **),她希望輸出像@Bill代碼(** http://sqlfiddle.com/# !2/bf3bd/1 **)... – jmail

+0

@jmail。 。 。你沒有在'tbl1'上添加唯一索引。這是解決方案的重要組成部分。 (http://sqlfiddle.com/#!2/a85fe8。)這種方法與Bill的方法幾乎相同*除了*它是關於被忽略的錯誤的具體情況。而且,我還早一分鐘;)。 –

+0

我試過'沒有獨特的索引'..但沒有用,輸出中沒有任何改變... – jmail

2

您可以使用INSERT IGNORE。

INSERT IGNORE INTO tpl1 SELECT * FROM tpl2; 

這意味着,當插入試圖從TPL2複製一個給定的行TPL1,並且該行已經存在(即,新行會與現有的主鍵或唯一KEY價值衝突),那麼它只是跳過那一行。

+1

+1對**簡單和快速**爲您的查詢理解,我喜歡它@Bill – jmail

0

您可以通過左側的接合部TPL1到TPL2,只有將那些不以TPL1

insert into tpl1 (col_1) 
    select a.col_1 
    from tpl2 a 
     left join tpl1 b using (col_1) 
    where 
     b.col_1 is null;