在可能有也可能没有主键的表上插入行和更新行

时间:2012-07-31 15:51:56

标签: sql sql-server database primary-key insert-update

我正在尝试更新一个表,以便添加缺少的行,并使用另一个数据库中另一个表中的信息作为参考来更新不是最新的行。

但是,有些表有主键,有些表没有。 如果存在主键,则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]

更新完美无缺,但如果有一个副本,则插入将完全无法运行。

有关如何使此代码生效的任何建议吗?

此外,还有任何关于在没有主键的情况下在同一桌面上做同样事情的提示吗?

1 个答案:

答案 0 :(得分:2)

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

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

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