如何取唯一的id号

msw120 2013-12-06 12:43:46
想做一个自动取id的功能,每次新增数据都会让id+1。
问题是如何控制多用户同时新增数据的时候不会取到相同的id号,是不是要用那种全局的id来做,该怎么取呢。请高手帮忙解答下。谢谢
...全文
207 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
發糞塗牆 2013-12-06
  • 打赏
  • 举报
回复
發糞塗牆 2013-12-06
  • 打赏
  • 举报
回复
引用 7 楼 msw120 的回复:
[quote=引用 5 楼 DBA_Huangzj 的回复:] 高并发的情景下,@@identity不能保证准确性
看了版主的帖子,我决定用 SELECT IDENT_CURRENT('表名') 查出自增列的最大值,然后+1,不知道这样行不行? IDENT_CURRENT这个可以防止并发吧? 为什么用@@identity也不能保证准确性呢。[/quote]@@identity是语句插入时获得的,如果刚好多个会话在几乎同时插入,可能获得的是同一个
LongRui888 2013-12-06
  • 打赏
  • 举报
回复
引用 7 楼 msw120 的回复:
[quote=引用 5 楼 DBA_Huangzj 的回复:] 高并发的情景下,@@identity不能保证准确性
看了版主的帖子,我决定用 SELECT IDENT_CURRENT('表名') 查出自增列的最大值,然后+1,不知道这样行不行? IDENT_CURRENT这个可以防止并发吧? 为什么用@@identity也不能保证准确性呢。[/quote] 这个也不行,如果同时有3个人,都查,那么返回的是一个数字,这样就又会导致并发的问题了
msw120 2013-12-06
  • 打赏
  • 举报
回复
引用 5 楼 DBA_Huangzj 的回复:
高并发的情景下,@@identity不能保证准确性
看了版主的帖子,我决定用 SELECT IDENT_CURRENT('表名') 查出自增列的最大值,然后+1,不知道这样行不行? IDENT_CURRENT这个可以防止并发吧? 为什么用@@identity也不能保证准确性呢。
LongRui888 2013-12-06
  • 打赏
  • 举报
回复
引用 4 楼 tcmakebest 的回复:
3楼的方法我也在用的,就是把插入语句和查询ID放在一个语句中: string sql="insert into xxx(...) values(...) select @@identity";
用这个更加准确: select SCOPE_IDENTITY()
發糞塗牆 2013-12-06
  • 打赏
  • 举报
回复
高并发的情景下,@@identity不能保证准确性
tcmakebest 2013-12-06
  • 打赏
  • 举报
回复
3楼的方法我也在用的,就是把插入语句和查询ID放在一个语句中: string sql="insert into xxx(...) values(...) select @@identity";
Andy__Huang 2013-12-06
  • 打赏
  • 举报
回复
设置列为自动递增ID,每新增完数据获取最新的ID (新增时用事务处理) select @@IDENTITY
LongRui888 2013-12-06
  • 打赏
  • 举报
回复
如果可以的话,建议你用自增列把,比如:


--drop table tb

create table tb(
id int identity(1,1) primary key,
vv varchar(10)
)

--不需要插入自增列,由sql server会自动增加1,解决了并发的问题
insert into tb(vv)
values('a1')

insert into tb(vv)
values('a2')

insert into tb(vv)
values('a3')

select *
from tb
/*
id	vv
1	a1
2	a2
3	a3
*/

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧