没有连接的插入语句导致重复,之前没有重复项?

时间:2014-02-19 13:28:51

标签: sql sql-server

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

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

出于某种原因,对我而言似乎是重复的objectId,此软件的一个实例已经出现问题,导致以下错误:

  

消息1505,级别16,状态1过程sp_rebuildPageContentCache,第50行

     

CREATE UNIQUE INDEX语句终止,因为找到了对象名称“dbo.pageContentCache”和索引名称“IX_pageContentCache”的重复键。重复键值为(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语句只是将数据从一个表复制到另一个表,所以...这个副本来自何处?

3 个答案:

答案 0 :(得分:1)

尝试以下方法:

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

无法理解为什么会有重复项,因为正如您所提到的,您的select语句中没有连接。无论如何,我的猜测是,distinct关键字将确保删除重复项。

答案 1 :(得分:0)

这是我之前见过的SQL Server数据库错误。您可能需要修补最新的Service Pack并重试。

答案 2 :(得分:-1)

我不太确定这句话是否符合你的想法:

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

你可以试试这个:

WITH SUBQUERY AS
( select 
COUNT(objectId) OVER (PARTITION BY objectId) AS CNT_OBJECT_IDS,
objectId
FROM #contentcache)
SELECT * FROM SUBQUERY WHERE CNT_OBJECT_IDS > 1

看看这是否能让你回到任何行。

此外,我以前从未使用过群集,我想知道他们是否会做一些我们不知道的其他事情。你能试着说吗

PRIMARY KEY

而不是

PRIMARY KEY CLUSTERED
在您的约束定义中

并查看它是否会影响您的问题?