Sql server 如何在MS SQL Server 2005中自动设置行的SNo?

Sql server 如何在MS SQL Server 2005中自动设置行的SNo?,sql-server,sql-server-2005,Sql Server,Sql Server 2005,我在数据库表中有几行(我们称之为Customer)。每行都由SNo编号,SNo由MS SQLServer固有的identity属性自动递增。但是,当我删除某一行时,该行的行号保留为空,但我希望该表能够自动更正自身 举个例子: 我有一个示例Customer表,其中包含以下行: SNo CustomerName Age 1 Dani 28 2 Alex 29 3 Duran 21 4 Mark 24 假设我删除第三行,

我在数据库表中有几行(我们称之为Customer)。每行都由SNo编号,SNo由MS SQLServer固有的identity属性自动递增。但是,当我删除某一行时,该行的行号保留为空,但我希望该表能够自动更正自身

举个例子:

我有一个示例Customer表,其中包含以下行:

SNo CustomerName Age

1   Dani         28
2   Alex         29
3   Duran        21
4   Mark         24
假设我删除第三行,该表如下所示:

SNo CustomerName Age

1   Dani         28
2   Alex         29
4   Mark         24
SNo CustomerName Age

1   Dani         28
2   Alex         29
3   Mark         24
CustomerOrder
-------------
OrderID     INT
SNo         INT
OrderDate   DATETIME
...
但是我想让桌子看起来像这样:

SNo CustomerName Age

1   Dani         28
2   Alex         29
4   Mark         24
SNo CustomerName Age

1   Dani         28
2   Alex         29
3   Mark         24
CustomerOrder
-------------
OrderID     INT
SNo         INT
OrderDate   DATETIME
...
我怎样才能做到这一点

请帮帮我

期待中的感谢


我认为你不想那样做。想象一下,您有另一个存储所有客户订单的表
CustomerOrder
。该表的结构可能如下所示:

SNo CustomerName Age

1   Dani         28
2   Alex         29
4   Mark         24
SNo CustomerName Age

1   Dani         28
2   Alex         29
3   Mark         24
CustomerOrder
-------------
OrderID     INT
SNo         INT
OrderDate   DATETIME
...

在本例中,
SNo
字段是
CustomerOrder
表中的外键,我们使用它将订单与客户关联起来。如果您从
Customer
表中删除记录(例如使用
SNo=1
),是否要返回并更新整个
CustomerOrder
表中的
SNo
值?最好让ID自动递增,不要担心由于删除而导致ID中出现空格。

我认为您不想这样做。想象一下,您有另一个存储所有客户订单的表
CustomerOrder
。该表的结构可能如下所示:

SNo CustomerName Age

1   Dani         28
2   Alex         29
4   Mark         24
SNo CustomerName Age

1   Dani         28
2   Alex         29
3   Mark         24
CustomerOrder
-------------
OrderID     INT
SNo         INT
OrderDate   DATETIME
...

在本例中,
SNo
字段是
CustomerOrder
表中的外键,我们使用它将订单与客户关联起来。如果您从
Customer
表中删除记录(例如使用
SNo=1
),是否要返回并更新整个
CustomerOrder
表中的
SNo
值?最好是让ID自动递增,不要担心由于删除而在ID中留下空格。

正如已经指出的那样,这样做会破坏与SNo的关系,但是如果您这样做是因为您在表示层中需要序号,例如,您可以使用

SELECT ROW_NUMBER() OVER(ORDER BY SNo ASC), SNo, CustomerName, Age FROM Customer

显然,在这种情况下,行号只是一个递增的数字,它与其他任何东西都没有意义。

正如已经指出的那样,这样做会破坏与SNo的关系,但是如果您这样做是因为您在表示层中需要序号,例如,您可以使用[1..n]行数与行数

SELECT ROW_NUMBER() OVER(ORDER BY SNo ASC), SNo, CustomerName, Age FROM Customer

显然,在这种情况下,行号只是一个递增的数字,它与其他任何东西都没有意义。

正如在其他答案中所指出的,这是一个坏主意,如果是为了演示,还有其他解决方案

-- Add data to temp table
select SNo, CustomerName, Age
into #Customer
from Customer

-- Truncate Customer
-- Resets identity to seed value for column
truncate table Customer

-- Add rows back to Customer
insert into Customer(CustomerName, Age)
select CustomerName, Age
from #Customer
order by SNo

drop table #Customer

正如在其他答案中指出的那样,这是一个坏主意,如果原因是演讲,那么还有其他解决方案

-- Add data to temp table
select SNo, CustomerName, Age
into #Customer
from Customer

-- Truncate Customer
-- Resets identity to seed value for column
truncate table Customer

-- Add rows back to Customer
insert into Customer(CustomerName, Age)
select CustomerName, Age
from #Customer
order by SNo

drop table #Customer
为什么不创建一个视图呢

CREATE VIEW <ViewName>
AS
SELECT     
ROW_NUMBER() OVER(ORDER BY SNo ASC) AS SNo
,CustomerName
,Age
FROM Customers

GO
创建视图
像
选择
(按SNo ASC排序)上的行号()作为SNo
,客户名称
年龄
来自客户
去
然后通过从视图中选择来访问customers表中的数据

当然,视图显示的SNo在关系上下文中没有任何意义,但返回的数据将与您希望它的外观完全相同。

为什么不创建视图

CREATE VIEW <ViewName>
AS
SELECT     
ROW_NUMBER() OVER(ORDER BY SNo ASC) AS SNo
,CustomerName
,Age
FROM Customers

GO
创建视图
像
选择
(按SNo ASC排序)上的行号()作为SNo
,客户名称
年龄
来自客户
去
然后通过从视图中选择来访问customers表中的数据


当然,视图显示的SNo在关系上下文中没有任何意义,但返回的数据看起来与您希望的完全一样。

似乎已经有人问过:似乎已经有人问过:只有在删除最后一行后插入数据时,这才有效。如OP在示例中所引用的,如果删除了SNo 3,而最后一行是SNo 4,则此操作不起作用。仅当您在删除最后一行后插入数据时,此操作才起作用。如OP在示例中引用的,如果删除了SNo 3,最后一行是SNo 4,否则,您可以使用上述代码创建一个存储过程,并将该存储过程作为数据源关联到gridview。或者,您可以使用上述代码创建一个存储过程,并将该存储过程作为数据源关联到gridview。