2012-07-31 145 views
1

我在嘗試更新表,以便添加缺少的行並使用來自另一個表上的信息更新未更新的行不同的數據庫作爲參考。在可能有或沒有主鍵的表上插入行和更新行

但是,有些表具有主鍵,有些不具有主鍵。 如果存在主鍵,insert命令將不會運行,並且如果沒有主鍵,則行將重複。

有沒有辦法讓insert命令跳過已存在的主鍵值?

我使用SQL Server Management Studio 2005和這裏是我的代碼到目前爲止關於與主鍵(PKcolumn)的表:

INSERT [testDB].[dbo].[table1] 
SELECT * FROM [sourceDB].[dbo].[table1] 

UPDATE test 
SET 
test.[PKcolumn] = source.[PKcolumn] 
,test.[column2] = source.[column2] 
,test.[column3] = source.[column3] 
FROM 
[sourceDB].[dbo].[sourceDB] AS source 
INNER JOIN 
[testDB].[dbo].[PKcolumn] AS test 
ON source.[PKcolumn] = test.[PKcolumn] 

更新的作品完美,但插入將無法運行如果甚至有一個重複。

有關如何使此代碼工作的任何建議?

此外,在沒有主鍵的表上做同樣的事情的任何提示?

+0

內部連接子句始終爲真可能是'source。[PKcolumn] = test。[PKcolumn]' – 2012-07-31 15:56:47

+0

這些表是否有任何具有唯一約束或唯一索引的列或列? ('NOT NULL UNIQUE'的行爲與'PRIMARY KEY'的行爲相同;都可以唯一標識所討論的事物,並且都可以用於外鍵引用。) – 2012-07-31 18:37:26

回答

2

你需要排除已存在於您的INSERT查詢表中的行,使用LEFT OUTER JOIN:

INSERT [testDB].[dbo].[table1] 
SELECT * FROM [sourceDB].[dbo].[table1] 
LEFT OUTER JOIN [testDB].[dbo].[table1] ON [sourceDB].[dbo].[table1].[PKcolumn] = [testDB].[dbo].[table1].[PKcolumn] 
WHERE [testDB].[dbo].[table1].[PKcolumn] IS NULL 

對於沒有主鍵的表,我想你需要加入所有列以避免重複。