删除行,重新播种非PK索引列? C#

时间:2017-03-23 11:25:05

标签: c# sql-server database

我一直绞尽脑汁,在网上搜索如何做到这一点,但没有运气。

问题,

我有一个datagrid,允许用户根据需要添加或删除行,它通过数据库中 NOT 的PK列索引列进行索引,例如:在这种情况下,ID是PK列,

  ID    |   Name   |  Index
Guid 1  | Name 1   |    1
Guid 2  | Name 2   |    2
Guid 3  | Name 3   |    3
Guid 4  | Name 4   |    4
Guid 5  | Name 5   |    5

因此,当使用删除行时会发生这种情况:在此示例中为第2行,

  ID    |   Name   |  Index
Guid 1  | Name 1   |    1
Guid 3  | Name 3   |    3
Guid 4  | Name 4   |    4
Guid 5  | Name 5   |    5

那么当删除行时,如何重置索引以保持当前顺序?所以它看起来像这样,

  ID    |   Name   |  Index
Guid 1  | Name 1   |    1
Guid 3  | Name 3   |    2
Guid 4  | Name 4   |    3
Guid 5  | Name 5   |    4

我看过Reset identity seed after deleting records in SQL Server ,但这是服务器端,我想通过C#做这个应用程序端,更不用说这似乎只适用于PK列?

我将如何做这样的事情?

1 个答案:

答案 0 :(得分:2)

根据您的描述,您不需要表格中的“索引”列。但是,您应该在桌面上写一个视图并使用the row_number() function来实现您的目标,如下所示:

    create table [Example]
    (
        [ID] uniqueidentifier not null primary key,
        [Name] varchar(50) not null
    )
    go

    create view [vExample]
    as
        select [e].[ID]
             , [e].[Name]
             , row_number() over (order by [Name] asc) as [Index]
        from [Example] as [e]
    go

    insert into [Example] ( [ID] , [Name] )
    values  (newid(), 'Name 1')
          , (newid(), 'Name 2')
          , (newid(), 'Name 3')
          , (newid(), 'Name 4')
          , (newid(), 'Name 5')

    select * from [vExample] as [e]

    delete from [vExample] where [Index] = 2

    select * from [vExample] as [e]

但我不建议删除基于该列的记录,而是使用实际的主键,以确保删除正确的行。我刚才用这个作为演示。在现实世界中,另一个连接可能已经删除了“第2行”,这意味着当您使用相同的where子句时将删除以下行,因为编号已随第一次删除而更改。