2015-07-09 60 views
0

我這是指作爲一個修補程序工作,所以,這只是爲了運行一個時間來修改數據庫中的一些條目的SQL腳本:防止多個插入與SQL補丁腳本

INSERT INTO Table1 ... 
INSERT INTO Table2 ... 
etc... 

如果客戶服務(或者正在應用該補丁的人)將意外地多次運行該腳本,那麼會在某些表中存在重複的條目,這會產生不希望的效果。

我的想法是隻在每個INSERT之前有一個DELETE聲明,這樣如果即將插入的條目已經存在,它將被刪除,避免重複。如果輸入不在那裏,則DELETE語句對數據庫不起作用。

有沒有更好的方法來處理這個問題,如果是的話,爲什麼建議的方法被認爲更好或更合適?由於腳本只能運行一次,因此性能不是問題。

請注意,我不是問是否存在另一種方法。我問,鑑於CONTEXT(腳本是一個補丁,它只能運行一次,以前是否),上述解決方案是否合適,還是有一個原因,我應該避免使用我的方法並以另一種方式解決問題?

+1

可能重複[SQL服務器插入,如果不存在(http://stackoverflow.com/questions/20971680/sql-server-insert-if-not-存在) –

+0

您正在使用哪些DBMS? Postgres的?甲骨文? –

+0

我正在使用SQL Server – Mike

回答

1

我會用merge聲明:

 merge into [dbo].[Table] target using (
     VALUES    
     (100001, 'Value1', NULL, 1) 
     ,(100002, 'Value2', NULL, 1)    
     ) 
     as source ([Id], [Column1], [Column2], [Column3])  
     on target.[Id] = source.[Id] 

     when matched then update set 
     [Column1] = source.[Column1] 
     ,[Column2] = source.[Column2] 
     ,[Column3] = source.[Column3] 

     when not matched by target then 
     insert ([Id], [Column1], [Column2], [Column3]) values 
     (source.[Id],source.[Column1],source.[Column2],source.[Column3]) 
     ;