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

时间:2011-04-24 14:29:00

标签: sql-server sql-server-2005

我在数据库表中有几行(我们称之为Customer)。每行都由SNo编号,它会自动增加MS SQLServer中固有的标识属性。但是,当我删除特定行时,特定行号留空,但我希望表自动更正。

举个例子:

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

SNo CustomerName Age

1   Dani         28
2   Alex         29
3   Duran        21
4   Mark         24

假设我删除第3行,表格如下:

SNo CustomerName Age

1   Dani         28
2   Alex         29
4   Mark         24

但我希望桌子看起来像这样:

SNo CustomerName Age

1   Dani         28
2   Alex         29
3   Mark         24

我怎样才能做到这一点?

请帮帮我

感谢您的期待

5 个答案:

答案 0 :(得分:3)

正如已经指出的那样做会破坏与SNo的关系中的任何事情,但是如果你这样做是因为你需要在你的表示层中使用序数,你可以用[1..n]行数来取消;

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

显然,在这种情况下,行号只是一个递增的数字,与其他任何内容相比毫无意义。

答案 1 :(得分:2)

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

CustomerOrder
-------------
OrderID     INT
SNo         INT
OrderDate   DATETIME
...

在这种情况下,SNo字段是CustomerOrder表中的外键,我们使用它将订单与客户相关联。如果您从Customer表中删除记录(比如SNo = 1),您是否会返回并更新整个SNo表中的CustomerOrder值?最好只让ID的自动增量,而不用担心由于删除而导致ID中的空格。

答案 2 :(得分:2)

为什么不创建视图?

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

GO

然后从视图中选择,访问customers表中的数据。

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

答案 3 :(得分:1)

Using transactions when inserting records in the Database with C#

You have to use DBCC CHECKIDENT(table_name, RESEED, next_val_less_1);

答案 4 :(得分:1)

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

-- 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