如何为表示记录编号的表中的每一行指定一个数字?

时间:2013-02-17 18:21:32

标签: sql-server database-design sql-server-express

如何以一种方式显示表格中的行数,即添加新记录时,表示该行的数字会更高,删除记录时,数字会相应更新?
为了更清楚,假设我有一个这样的简单表:

  

ID int(主键)名称varchar(5)

将ID设置为自行递增(使用标识规范),因此它不能表示行(记录)的数量,因为如果我有例如3条记录:

  

ID NAME
   1亚历克斯    2斯科特    3萨拉

我删除了Alex和Scott并添加了一条新记录:

3 Sara
4 Mina 

所以基本上我正在寻找一个sql端解决方案,这样我就不会在多个地方更改源代码中的任何其他内容。

我试着写一些东西来完成工作,但它很糟糕。这是:

SELECT        COUNT(*) AS [row number],Name
FROM          dbo.Test
GROUP BY ID, Name
HAVING        (ID = ID)

显示为:

row number            Name
1                     Alex
1                     Scott
1                     Sara

虽然我希望它显示为:

row number            Name
1                     Alex
2                     Scott
3                     Sara

4 个答案:

答案 0 :(得分:8)

如果您只是想在选择数据时而不是在数据库中对行进行编号,那么您可以使用此

select row_number() over(order by id) from dbo.Test

这将为第n行提供行号n。

答案 1 :(得分:2)

您想要的是一个自动增量。

对于SQL-Server,这是通过将IDENTITY(1,1)属性添加到表定义来实现的。

其他RDBMS使用不同的语法。例如Firebird有生成器,它进行计数。在BEFORE-INSERT触发器中,您可以将ID字段分配给生成器的当前值(将自动增加)。

答案 2 :(得分:2)

尝试

SELECT id, name, ROW_NUMBER() OVER (ORDER BY id) AS RowNumber
FROM   MyTable

答案 3 :(得分:0)

前一段时间我遇到了这个问题,但我使用的是SQL Server 2000,所以虽然行号()是最好的解决方案,但在SQL Server 2000中,这是不可用的。解决方法是创建一个临时表,使用自动增量插入所有值,并将当前表替换为T-SQL中的新表。