2012-07-31 73 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 

对于没有主键的表,我想你需要加入所有列以避免重复。