我遇到一些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
(有两列,objectId
和content
)后,我可以运行以下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语句只是将数据从一个表复制到另一个表,所以...这个副本来自何处?
答案 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
在您的约束定义中并查看它是否会影响您的问题?