我在数据库表中有几行(我们称之为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
我怎样才能做到这一点?
请帮帮我
感谢您的期待
答案 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