SQL 数据库 学习 032 identity的用法 --- 如何设置主键自动增长(用户不需要为identity修饰的主键赋值)

本文介绍了SQL Server中identity字段的用法,用于设置主键自动增长。当删除数据后,可通过重置种子值让主键从特定值开始递增。identity字段适用于整型数据列,常与主键约束配合创建唯一标识。虽然可以直接插入数据,但一般不推荐,除非先禁用自动增长功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


  • 我的电脑系统:Windows 10 64位
  • SQL Server 软件版本: SQL Server 2014 Express

本篇博客里面使用了 scott 库,如何你现在还没有添加这个库到你的服务器里面,请在查看本篇博客前,访问这篇博文来在你的服务器里面附加scott库。


identity 的用法 — 如何设置主键自动增长(用户不需要为identity修饰的主键赋值)

create table student3
(
    student_id int primary key identity (100, 5),
    student_name nvarchar(200) not null
)

select * from student3
insert into student3 (student_name) values ('张三');
insert into student3 values ('李四');  -- ok
delete from student3 where student_name = '李四';
insert into student3 (student_name) values ('王五');

如何重新设置identity 字段的值

表中删除数据又插入数据会导致主键不连续递增 怎么办?

不重要。主键是否连续增长不是非常重要。

如果对表中数据进行了删除操作,如何让 identity 字段重新从某个值开始自增?

create table emp
(
    empid int identity(1, 1),
    ename nvarchar(20) not null
);

insert into emp values('aaaa');
insert into emp values('bbbb');
insert into emp values('cccc');
insert into emp values('dddd'); -- 10行
select * from emp
delete from emp where emp where wmpid=4 -- 删除empid为4的记录
select * from emp
insert into emp values('eeee') -- 因为执行10行时empid为4,所以执行本句时,empid为5
select * from emp
delete from emp where empid=5
dbcc checkident('emp', reseed, 3) -- 17行 把emp表中identity字段的初始值重新设置为3

insert into emp values('eeee') -- 此时插入记录时。empid为4,因为17行代码把empid设置成了3
select * from emp
dbcc checkident('emp', reseed, 0)

种子的值也可以是零,这样设置的话,用户插入值时,种子的初始值将从1开始。


总结:

identity 表示该字段的值会自动更新,不需要我们维护,通常情况下我们不可以直接给 identity 修饰的字符赋值,否则编译时会报错。

语法格式为:

  • identity [(m, n)]
  • m 表示的是初始值,n 表示的是每次自动增加的值
  • 要么同时指定 mn 的值,要么 mn 都不指定,不能只写其中一个值。如:identity(3,2)identity 都是正确的,但是 identity(3)identity(2)identity 都是错误的。
  • 如果 mn 都未指定,则取默认值(1, 1)

数据类型是整型的列才能被定义成标识列:

  • intbigintsmallint 列都可以被定义成 identity
  • 不含有小数位的 decimalnumeric 也可以被标记为 identity。如:decimaldecimal(6, 0) 字段都可以被标记为 identity,但是 decimal(6, 2) 字段就不能被标记为 identity

标识列通常与 primary key 约束一起用作表的唯一行标识符:

  • 非主键也是可以被定义为 identity的,但不推荐。

如何向 identity 字段插入数据

通常identity标记的字段我们是不需要插入数据的,即我们不需要维护 identity 字段的值,它会自动更新,如果我们需要向identity修饰的字段插入值,则必须满足如下两点:

  1. 先得执行 set identity_insert [database.[owner.]] {table} {on | off}
  2. 插入数据时必须得指定 identity 修饰的字段的名字

如何向 identity 字段插入数据示例

create database Test
use test;
create table dept
(
    deptid decimal(6, 0) identity,
    deptname varchar(20),
);
set identity_insert test.dbo.dept on
    --执行本语句的目的是:希望可以向identity修饰的字段插入值
    --不可以改为set identity_insert dept on
    --不可以改为set identity_insert dbo.test.dept on
    --不可以改为set identity_insert dbo.test.dept.on
insert into dept (deptid, deptname) values (1, 'zhangsan')
    --不能改为:insert into dept values (1, 'zhangsan') -- 13

默认情况下,使用identity关键字修饰的主键是自动增长的,如果想手动设置主键的值,需要先将目标表打开:set identity_insert test.dbo.dept on,然后再使用insert into dept (deptid, deptname) values (1, 'zhangsan') 命令来手动设置主键的值。


请访问:http://www.aobosir.com/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值