2014-01-19 167 views
10

我想從使用「OPENQUERY」的MS SQL Server插入記錄到MySQL數據庫中,但我想要做的是忽略重複鍵消息。所以當查詢運行到一個副本時,忽略它並繼續前進。什麼是MS SQL Server中的「插入IGNORE」等效項?

我可以做什麼來忽略重複?

下面是我在做什麼:

  1. 從MySQL拉動記錄使用「OPENQUERY」來定義的MySQL「A.record_id」
  2. 加入這些記錄到MS SQL Server中記錄「有具體標準而不是直接ID「從這裏我發現一個新的相關的」B.new_id「記錄標識符在SQL Server中。
  3. 我想將找到的結果插入到MySQL中的新表中,如下所示A.record_id,B.new_id在新表中,我將A.record_id設置爲該表的主鍵。

問題是,當連接表A到表B有時候,我發現2 +記錄到表B匹配的標準,我正在尋找導致A.record_id值在我的數據集然後將其插入導致問題的表A中。注意我可以使用聚合函數來消除記錄。

+0

@MartinSmith我刪除了混淆的部分形成我的問題。我嘗試使用IGNORE_DUP_KEY,但出現語法錯誤。我不知道我是否可以用openquery來使用它。這裏是我的用例INSERT IGNORE_DUP_KEY OPENQUERY – Jaylen

+0

'IGNORE_DUP_KEY'是索引的一個屬性。不是您在查詢中使用的關鍵詞。除非您插入到SQL Server中,否則它不相關,因此請求澄清傳輸方向。 –

回答

8

我不認爲有一個具體的選擇。但它是很容易的做到:

insert into oldtable(. . .) 
    select . . . 
    from newtable 
    where not exists (select 1 from oldtable where oldtable.id = newtable.id) 

如果有不止一套獨特的鍵,你可以添加額外的not exists語句。

編輯:

該訂正問題:

insert into oldtable(. . .) 
    select . . . 
    from (select nt.*, row_number() over (partition by id order by (select null)) as seqnum 
      from newtable nt 
     ) nt 
    where seqnum = 1 and 
      not exists (select 1 from oldtable where oldtable.id = nt.id); 

row_number()的功能分配的一組行內的順序號到每一行。該組由partition by聲明定義。數字從1開始並從那裏增加。條款order by表示您不關心訂單。每個id的一行將具有值1.重複行的值將大於1。 seqnum = 1每個ID只能選擇一行。

+0

感謝那個筆記。問題是,在我選擇我可能會產生重複和插入2記錄具有相同的唯一值時,我得到一個錯誤,因爲最初記錄不存在,但當試圖插入值2不同時間,然後我遇到錯誤。 – Jaylen

+0

你能解釋第二個查詢嗎?我從來沒有用過(分區由.....我不知道它是什麼,它做了什麼。我需要知道如何將它應用到我的查詢中。 – Jaylen

+0

這仍然適用於我。我重申了我的問題來解釋我遇到的問題。請檢查一下。我認爲你的回答是在正確的軌道上 – Jaylen

7

如果您使用SQL Server 2008+,則可以使用MERGE來執行INSERT(如果行不存在)或UPDATE

例子:

MERGE 
INTO dataValue dv 
USING tmp_holding_DataValue t 
ON  t.dateStamp = dv.dateStamp 
     AND t.itemId = dv.itemId 
WHEN NOT MATCHED THEN 
INSERT (dateStamp, itemId, value) 
VALUES (dateStamp, itemId, value) 
+1

它看起來像他試圖從MS Sql與OPENQUERY插入記錄到MySql。在這種情況下,我認爲合併不會有所幫助。 –

+2

問題和標題混淆,相反。我查看了@Mike在SQL Server中要求「INGORE INSERT」等同於MySQL的標題。而問題的意思則相反,即從SQL Server插入MySQL。 –

相關問題