sql - 没有连接的插入语句会导致先前不存在重复项的重复项?

标签 sql sql-server

我遇到了一些 SQL 问题,导致了我意想不到的结果。我将来自各种表的信息存储在另一个表中,该表用作网站上搜索页面的一部分。每个页面的所有页面数据以及其他页面上其他元素(如日历等)的数据都在名为 pageContentCache 的表中引用。该表通常有一个使用以下内容创建的索引:

alter table pageContentCache add
    constraint [IX_pageContentCache] PRIMARY KEY CLUSTERED (
        [objectId]
    )

由于某种原因,对我来说似乎是重复的 objectId,该软件的一个实例开始出现问题,导致以下错误:

Msg 1505, Level 16, State 1 Procedure sp_rebuildPageContentCache, Line 50

The CREATE UNIQUE INDEX statement terminated because a duplicate key was found for the object name 'dbo.pageContentCache' and the index name 'IX_pageContentCache'. The duplicate key value is (21912).

因此,为了调试该问题,我得到了将要输入 pageContentCache 表的所有数据加载到临时表 #contentcache,首先,这样我可以看一下。

这是我开始有点困惑的地方......

将数据插入到 #contentcache(有两列,objectIdcontent)后,我可以运行以下 SQL语句,它不会返回任何内容:

select objectId, count(objectId) from #contentcache
group by objectId having count(objectId) > 1

没有返回任何记录。如果我随后运行以下 SQL:

insert into pageContentCache (objectId, contentData)
    select objectId, content
    from #contentcache

这会将 #contentcache 中的所有数据按照您的预期插入到 pageContentCache 中。但是,如果我随后运行以下 SQL,它将返回重复项:

select objectId, count(objectId) from pageContentCache
group by objectId having count(objectId) > 1

然后返回重复项:

objectId     (no column name)
21912        2

没有触发器或类似的东西与此表关联,插入语句只是将数据从一个表复制到另一个表,所以...这个重复项来自哪里?

最佳答案

尝试以下操作:

insert into pageContentCache (objectId, contentData)
    select distinct objectId, content
    from #contentcache

不明白为什么会有重复项,因为正如您所提到的,您的 select 语句中没有联接。无论如何,我的猜测是,distinct 关键字将确保消除重复项。

关于sql - 没有连接的插入语句会导致先前不存在重复项的重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21881933/

相关文章:

sql - 在表 C 中不存在的表 B 中查找表 A 中缺失的记录

c# - 可以使用 SqlBulkCopy 将信息插入 2 个表的 View 中吗?

mysql - SUBSTR 没有返回记录 (mysql)

mysql - 合并 2 个 MySQL 查询

c# - AddWithValue 方法 (C#) 什么都不做

sql - group_concat 查询性能

mysql - 使用 IF 语句进行交叉表查询

java - sqlserver2010的maven依赖?

sql - 如何从 SQL Server 表中检索特定行?

c# - Linq2SQL : Select only some columns, 但仍然可以提交更改