【问题标题】:Inserting rows and updating rows on tables that may or may not have primary keys在可能有也可能没有主键的表上插入行和更新行
【发布时间】:2012-07-31 15:51:55
【问题描述】:

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

但是,有些表有主键,有些则没有。 如果有主键插入命令将不会运行,如果没有主键,行将重复。

有没有办法让插入命令跳过已经存在的主键值?

我正在使用 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]

更新工作完美,但即使有一个重复,插入也不会运行。

关于如何使这段代码工作的任何建议?

另外,在没有主键的表上执行相同操作的任何提示?

【问题讨论】:

  • 内连接子句总是正确的,也许source.[PKcolumn] = test.[PKcolumn]
  • 表是否有任何列具有唯一约束或唯一索引? (NOT NULL UNIQUE 的行为类似于 PRIMARY KEY;两者都唯一标识有问题的事物,并且都可以在外键引用中使用。)

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


【解决方案1】:

您需要使用 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

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

【讨论】:

    猜你喜欢
    • 2019-01-27
    • 2016-04-23
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多