使用连续编号更新SQL

Bry*_*yan 31 t-sql sql-server

我想更新一个以1开头的连续编号的表.更新有一个where子句,因此只有满足该子句的结果才会重新编号.我可以在不使用临时表的情况下有效地完成此任务

zom*_*bat 52

这可能取决于您的数据库,但这是一个涉及使用变量的MySQL 5的解决方案:

SET @a:=0;
UPDATE table SET field=@a:=@a+1 WHERE whatever='whatever' ORDER BY field2,field3
Run Code Online (Sandbox Code Playgroud)

您应该编辑您的问题并指出您正在使用的数据库.

编辑:我找到了一个利用T-SQL for SQL Server 的解决方案.它与MySQL方法非常相似:

DECLARE @myVar int
SET @myVar = 0

UPDATE
  myTable
SET
  @myvar = myField = @myVar + 1
Run Code Online (Sandbox Code Playgroud)

  • 对于MS SQL呢? (2认同)
  • 谢谢您的帮助。因此,这将为更新找到的每条记录增加 myVar .. 太好了!如果我的编号字段是 varchar 而不是 int 类型怎么办。我也可以将 myVar 转换为 varchar 吗?再次感谢大家! (2认同)

Sha*_*nce 30

对于Microsoft SQL Server 2005/2008.ROW_NUMBER()函数于2005年添加.

; with T as (select ROW_NUMBER() over (order by ColumnToOrderBy) as RN
        , ColumnToHoldConsecutiveNumber from TableToUpdate
    where ...)
update T
set ColumnToHoldConsecutiveNumber = RN
Run Code Online (Sandbox Code Playgroud)

编辑:对于SQL Server 2000:

declare @RN int
set @RN = 0 

Update T
set ColumnToHoldConsecutiveNubmer = @RN
    , @RN = @RN + 1
where ...
Run Code Online (Sandbox Code Playgroud)

注意:当我测试@RN的增量似乎在将列设置为@RN之前发生,因此上面给出了从1开始的数字.

编辑:我刚刚注意到你想要在表格中创建多个连续数字.根据要求,您可以通过添加partition byover子句中的SQL Server 2005/2008一次性完成此操作:

; with T as (select ROW_NUMBER() 
        over (partition by Client, City order by ColumnToOrderBy) as RN
     , ColumnToHoldConsecutiveNumber from TableToUpdate)
update T
set ColumnToHoldConsecutiveNumber = RN
Run Code Online (Sandbox Code Playgroud)

  • 当我需要为每个新组和子组重新启动增量编号时,香农您的最终编辑多次为我工作。谢谢。你的答案应该排名更高。 (2认同)

eli*_*ezr 5

如果您想创建新的 PrimaryKey 列,请使用以下命令:

ALTER TABLE accounts ADD id INT IDENTITY(1,1) 
Run Code Online (Sandbox Code Playgroud)