SQL 关于主键和自增长标识列的修改

这篇文章我总结下在使用SQL查询或修改数据库的时候经常会碰到的两个问题,以及对这两个问题解决方法。

  • 第一个问题:对主键的修改,修改主键经常会碰到主键约束而造成update语句无法像对于普通无约束字段的操作那样方便。
  • 第二个问题:自增长标识列的修改,identity声明的标识字段在遭遇部分行的删除操作后,会默认自动继续增长而不会补全后增长。

开头先声明下我使用的开发环境是SQL Server 2008。

一、对主键的修改

主键值都会带有主键约束,当执行update操作或是其他操作的时候就会受到限制无法修改,解决的方法是:取消主键约束->删掉主键列->插入修改后的主键值。

(1)取消主键约束

取消主键约束的SQL语句如下:

alter table [表名] drop constraint [主键名]
输入表名和主键名时不要带中括号(下同),这里值得说明的是[主键名]并不是主键所在的字段名。主键名如果没有指定系统会自动分配一个,这时就需要查询主键名,查询主键名的方法如下:

--使用sql存储方式进行主键的查询
exec sp_pkeys @table_name='[表名]'
--查询表的详细信息,在其中找到主键名
sp_help [表名]
在这里顺便介绍下如何查询主键的列名,虽然这可能用的不多,但以下这个方法还是比较直观的:

select TABLE_NAME,COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE
where TABLE_NAME='[表名]'
(2)删掉主键列

上一步总结了一些补充的知识,这一步就简单许多了,方法如下:

alter table [表名] drop column [字段名]
(3)插入修改后的主键名

alter table [表名] add constraint [主键名] primary key(字段名)
值得说明的是,这里的主键名是自定义的主键名,指定之后如果以后还需取消主键约束就可以用这个主键名,而不再是系统自动分配的字段名了。

二、自增长标识符的修改

这个问题主要遇到的情形是,在删除了一段连续的带有自增长字段的一部分数据项之后,自增长序列不会自动补全,而是按照原先的计数继续增长。举个例一段连续的自增长字段(1,2,3,…,8,9),我们将其中的(7,8,9)delete掉后再向其中插入新的数据,此时新序列标号不是7而是10。

解决的方法有两种:设置序列自增长开关和重置序列自增长起始数。

(1)设置序列自增长开关

取消序列的自增长的SQL语句:

set identity_insert [表名] on
这条语句执行完后,再进行插入时需要指定插入项的序列值,而不会引起序列的自增长。当修改完成后,如果还想让序列具有自增长性需要进行恢复操作:

set identity_insert [表名] off
(2)重置序列自增长起始数

dbcc checkident([表名],RESEED,[数字])
该语句可用来重置自增长序列的起始值,[数字]处设置起始值。

dbcc checkident([表名],NORESEED)
该语句可用来查询目前自增序列的当前值。


  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 下面是创建该字段的SQL语句: ``` CREATE TABLE Scores ( Id INT IDENTITY(1,1) PRIMARY KEY NOT NULL ); ``` 该语句中,`Id`字段的数据类型为`INT`,非空(`NOT NULL`),主键(`PRIMARY KEY`),标识(`IDENTITY`)。`IDENTITY`关键字指示SQL Server在插入每个新行时为该生成唯一标识值,初始值为1,增量值为1。 ### 回答2: Sql字段名称Id,数据类型为int,说明该字段是成绩的编号,非空,主键标识,初始值为1,增量值为1。 首先,字段名称Id表示该字段是用于表示成绩的编号的,即用来唯一标识每个成绩记录的字段。 数据类型为int表示该字段的数据类型是整数型,即该字段的值必须是整数。 非空表示该字段的值在数据库中是不能为空的,即该字段的值不允许为空值。 主键表示该字段是该表的主键字段,表示该字段的值可以用来唯一标识一条记录,保证每个记录的唯一性。 标识表示该字段是一个自动增长,每插入一条新的记录时,自动为该字段赋予一个唯一的值,且该字段的值会自动增加。 初始值为1表示该字段的初始值是1,即在插入第一条记录时,该字段的值为1。 增量值为1表示该字段的增量是1,即每插入一条新的记录时,该字段的值会自动加1,确保每条记录的Id值都是唯一的且值之间的差是1。 ### 回答3: Sql字段名称Id,数据类型int,说明成绩编号,非空,主键标识,初始值为1,增量值为1。 Id是用来表示成绩编号的字段,数据类型为int,表示为整数。非空表示该字段的值不能为空,即每个记录都必须要有一个成绩编号。 主键表示该字段是用来唯一标识每一条记录的,保证每条记录的成绩编号都是唯一的。标识表示该字段是一个自增长,即每次插入一条记录时,该字段的值会自动增加。初始值为1,表示在插入第一条记录时,该字段的值为1。增量值为1表示每次增加一个单位值,即在插入下一条记录时,该字段的值会增加1。 通过以上的设置,我们可以确保成绩编号字段的值是唯一的,并且每次插入一条新的记录时,该字段的值会自动增加。这样就可以很方便地进行对成绩进行查询、排序等操作,也能够方便地进行相关的统计和分析工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值