SQL SERVER——给已有数据的表增加自增字段。

博客主要围绕已有数据的表展开,讲述了为其增加一个ID列并设置为自增长的操作。需先添加ID列,从1开始递增填充已有数据行的ID字段,之后再将id字段设置为自增字段,还提到用游标实现有些大材小用。

问题描述:我有一个已存在数据的表,现在需要增加一个ID列,并设置为自增长。

我添加ID列之后,需要从1开始递增把已有的数据行的ID字段填充,才可以设置为自增长的主键。

不说了,上SQL语句块

DECLARE @i int
SET @i=0
UPDATE table1 SET @i=@i+1,ID=@i

当然,用游标也是可以的,那就有些大材小用了。

之后再把id字段设置为自增字段就不会报错了。

### SQL Server字段自动递的方法 在 SQL Server 中,可以通过多种方式来实现字段的自功能。以下是几种常见的方式: #### 使用 `CREATE TABLE` 语句定义自字段 当创建新时,在定义字段属性时可以指定该字段为标识列(Identity Column),并定初始值和量。 ```sql CREATE TABLE ExampleTable ( Id INT IDENTITY(1, 1) PRIMARY KEY, Name NVARCHAR(50) ); ``` 这段代码示新建名为 `ExampleTable` 的格,并且其中有一个整数类型的 `Id` 列作为主键,它会从1开始按每次增加1来自动生成唯一编号[^1]。 对于已经存在的,则无法直接修改现有非标识列成为标识列;如果确实需要这样做的话,通常建议先备份数据再重建整个结构或通过其他变通手段间接达到目的[^2]。 #### 获取当前最大自值 为了获取某张特定里最新的自长数值,可利用内置函数 `IDENT_CURRENT()` 和 `IDENT_INCR()`. ```sql SELECT IDENT_CURRENT('tablename') + IDENT_INCR('tablename') AS newid; ``` 此查询返回下一次插入记录将会使用的ID号[^3]. #### 更新已有列使其变为连续递序列 有时可能遇到这样的情况——希望将一张已有中的某一列调整成按照一定规律递的形式。此时可以用如下方法构建辅助来进行转换操作: ```sql -- 创建临时存储新的顺序排列后的 id 及对应关系 WITH CTE AS (SELECT ROW_NUMBER() OVER (ORDER BY some_column) as rn,* FROM original_table_name) SELECT *,ROW_NUMBER() OVER () INTO temp_table FROM cte; UPDATE ot SET ot.id=tt.rn FROM original_table_name ot JOIN temp_table tt ON ot.some_unique_key = tt.some_unique_key ; DROP TABLE temp_table; -- 删除不再需要的中间过渡用 ``` 这里假 `original_table_name` 是要处理的目标名称,“some_column”代用来决定排序依据的一列而 “some_unique_key” 应替换为目标内能唯一区分各行的数据项[^4].
### 创建置主键自SQL Server 中,一旦创建了,默认情况下并不支持直接修改现有列以启用自动量功能。然而,可以通过以下方法实现这一目标: #### 方法一:删除并重新定义列 如果允许对数据库结构进行较大改动,则可以考虑先删除原有主键约束及其索引,再重建该字段作为 `IDENTITY` 属性的新版本。 ```sql -- 假有一个名为 'MyTable' 的以及一个整数类型的 ID 列 ALTER TABLE MyTable DROP CONSTRAINT PK_MyTable; -- 如果存在的话 GO -- 添加新的带有身份属性的ID列 ALTER TABLE MyTable ADD NewId INT IDENTITY(1,1); GO -- 将新添加的身份列为唯一且非空,并将其指定为主键 ALTER TABLE MyTable ADD CONSTRAINT UQ_NewId UNIQUE(NewId); GO -- 删除旧的ID列(可选) ALTER TABLE MyTable DROP COLUMN Id; GO -- 重命名NewId回原来的名称(可选) EXEC sp_rename 'MyTable.NewId', 'Id'; GO ``` 这种方法适用于能够承受一定时间停机维护的应用场景下使用[^1]。 #### 方法二:通过临时迁移数据 另一种更安全的方式是在不影响当前业务逻辑的前提下完成转换操作——即利用中间过渡格来保存原始记录,在此基础上构建具有所需特性的最终版架构计。 ```sql -- 复制原数据到一个新的临时中 SELECT * INTO TempTable FROM OriginalTable; -- 修改原有的OriginalTable结构,加入Identity特性 DROP TABLE OriginalTable; CREATE TABLE OriginalTable ( Id int NOT NULL PRIMARY KEY CLUSTERED IDENTITY(1,1), ...其他字段... ); -- 把之前备份下来的数据导入回来 INSERT INTO OriginalTable (...除开id外的所有字段...) SELECT ...除开id外的所有字段... FROM TempTable; -- 清理工作 DROP TABLE TempTable; ``` 此过程确保了即使发生错误也不会影响正在运行的服务实例;不过需要注意的是这会占用额外的空间资源直到整个流程结束为止[^2]。 对于已经存在的而言,上述两种方案都可以帮助实现在不破坏已有数据的情况下增加自动长的功能给主键列。当然最理想的情况还是应该提前规划好模式计从而避免后期频繁调整带来的麻烦[^3]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值