2011-06-01 70 views
1

我有一個看起來像這樣的聲明:SQL重複鍵幫助

insert table_name(...) 
select .... from ... join ... 

如何使用其中不存在或某事與此insert和select語句的效果,這樣,如果這個確切的代碼是重新運行具有相同的值,它不會拋出錯誤。我不希望有複製和粘貼選擇/加入的檢查,因爲它是一個代碼相當大的塊,那麼有沒有辦法做這樣的事情

if not exists (insert table_name(...) 
       select ... from...join) 

,或者是別的東西像

insert table_name(...) 
if not exists(select ... from ... join) 
+0

你可以使用[除](http://msdn.microsoft.com/en-us/library/ms188055.aspx)但是除非你對在正確的查詢中可以使用的where子句有一些瞭解,否則效率會非常低下。 – 2011-06-01 19:52:11

回答

1

試圖保持這一般性,因爲你做了,仍然有它的意義。希望這是可以理解的。

insert table_name(...) 
select .... from ... join ... 
WHERE NOT EXISTS(SELECT NULL 
        FROM table_name 
        WHERE PKColumn = YourOuterSelectTable.PKColumn) 

要儘量多放些肉就可以了:

/* Assume Column1 is primary key */ 
INSERT INTO table_name 
    (Column1, Column2) 
    SELECT a.Column1, b.Column2 
     FROM TableA a 
      INNER JOIN TableB b 
       ON a.Column1 = b.FKColumn1 
     WHERE NOT EXISTS (SELECT NULL 
           FROM table_name 
           WHERE Column1 = a.Column1) 
0

您可以只是把它放在一個try catch塊,如果此插入失敗只是吃一個例外。

http://geekswithblogs.net/ram/archive/2006/10/12/93829.aspx

關於這一點我必須說,這被認爲是不好的做法,使用異常來控制邏輯流。

我更關心爲什麼會出現這種情況,我很難考慮在出現這個問題的好設計中的合法情況?

0

在你 選擇....從...加入...

做左連接到要插入與要插入

如果這些加入了新值的表值爲null,那麼您可以安全地插入而不會出錯。