【问题标题】:View with index causes Cannot insert duplicate key row on an update使用索引查看导致无法在更新中插入重复的键行
【发布时间】:2014-06-30 22:24:43
【问题描述】:

我创建了一个连接表的视图,并在该视图上创建了一个聚集索引,这样我就可以从多个表中对我需要的所有数据进行全文搜索。它工作得很好,但我无法在具有唯一索引'IX_vPRs'的对象'dbo.vPRs'中插入重复的键行。重复键值为 (47)。此语句在 proc 中运行时出错:

UPDATE prHdr
SET PRStatus=3
WHERE PrId=@prId

我不明白为什么更新语句会在视图中插入一行(正如错误所解释的那样)。

有什么想法吗?

定义:

CREATE VIEW [dbo].[vPRs]
    WITH SCHEMABINDING
AS 
SELECT a.PrSeriesId,
       DivisionId [Division], 
       DateStart, 
       DateEnd, 
       Showroom, 
       VendorId, 
      VendName,
      PlmVendorId,
       b.Style, 
      e.Description [Status],
      f.FullName Requester,
        COUNT_BIG(*)AS countbig
FROM [dbo].[PrHdr] a
JOIN [dbo].[PrDtl] b ON a.prId=b.prId
JOIN dbo.PrSeries p ON a.PrSeriesId=p.PrSeriesId
JOIN [dbo].[PrStatus] e on a.PrStatusId = e.PrStatusId
JOIN [dbo].[User] f on p.UserCreate=f.UserName
GROUP BY a.PrSeriesId,
       DivisionId, 
       DateStart, 
       DateEnd, 
       Showroom, 
       VendorId, 
      VendName,
      PlmVendorId,
       b.Style, 
      e.Description,
      f.FullName

GO

/****** Object:  Index [IX_vPRs]    Script Date: 6/30/2014 10:45:49 PM ******/
CREATE UNIQUE CLUSTERED INDEX [IX_vPRs] ON [dbo].[vPRs]
(
    [PrSeriesId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

【问题讨论】:

  • 那么视图的定义是什么?包括索引?更改连接中涉及的列的值肯定会导致将行添加到连接结果中。
  • 我用定义编辑了 OP
  • @MartinSmith 你开始让我想到加入。由于我正在更新状态列并且该状态列正在连接中使用,因此该更改将导致视图查询中的另一行,因为它与其他相关行不同。所以我添加了行 ID 来查看并将其用于索引。看来我可以走了。

标签: sql-server sql-server-2012


【解决方案1】:

索引视图将数据具体化为视图的一部分,以便在查询时不必转到基础表来获取值。

看起来视图定义不正确或唯一索引定义不正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多