关于sqlserver2008列的自动增长

fihuang 2010-06-11 08:23:45
有几种方式可以设置列的自动增长?除了IDENTITY(1,1)之外,还有别的吗?

最重要的是:insert一条数据以后,怎么返回这个字段的值?
我看到了好几种,不知道哪一个最安全、准确:
IDENT_CURRENT 函数返回为任何会话和任何作用域中的特定表最后生成的标识值。
@@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。
SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值。


谢谢大家!
...全文
1157 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhufeng2012qq 2012-08-27
  • 打赏
  • 举报
回复
多线程中用自动标识列真的安全吗?
ocean4838 2010-08-16
  • 打赏
  • 举报
回复
学习了。。。。。。。。。。。
fihuang 2010-08-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lcw321321 的回复:]

安全是指返回的值有可能不是当时增加的那条记录的值是不?
如果是这样的话,那还真不安全。除非提高数据库的隔离等级。或者自己写一个自动增长列了。
[/Quote]我说的安全就是这个意思。当很多用户同时插入的时候,返回的值有没有可能搞混掉?如果插入和返回值都是放在一个存储过程里的,这样是不是100%的安全?
CHENXINGNIAN 2010-06-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xys_777 的回复:]
引用 6 楼 fihuang 的回复:
SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值。
100%安全么

学习了,最近也想学习下这个,但是时间安排不过来.先复制下来研究下,想把mysql的数据库 装饰设计交流论坛转换到mssql
[/Quote]
lcw321321 2010-06-16
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 fihuang 的回复:]
引用 8 楼 lcw321321 的回复:

安全是指返回的值有可能不是当时增加的那条记录的值是不?
如果是这样的话,那还真不安全。除非提高数据库的隔离等级。或者自己写一个自动增长列了。
我说的安全就是这个意思。当很多用户同时插入的时候,返回的值有没有可能不是当时增加的那条记录的值。如果插入和返回值都是放在一个存储过程里的,这样是不是100%的安全?
[/Quote]

设计思路是:需要增加一张表,用来存放单据的最大值,然后设计一个存储过程是专门生成单号。
create table sysBill(billtype char(5),bill_number int)
go
create proc GetBillno(@billtype char(5),@bill_no char(20) output)
as
begin
set @bill_no=bill_number +1 from sysBill where billtype=@billtype
update sysBill set bill_number=bill_number +1 where billtype=@billtype
--bill_number 保证了唯一的安全
end
zhoubupt 2010-06-12
  • 打赏
  • 举报
回复
自动生成标识列
chunchun0003 2010-06-12
  • 打赏
  • 举报
回复
IDENTITY(1,1)
lcw321321 2010-06-12
  • 打赏
  • 举报
回复
安全是指返回的值有可能不是当时增加的那条记录的值是不?
如果是这样的话,那还真不安全。除非提高数据库的隔离等级。或者自己写一个自动增长列了。
永生天地 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fihuang 的回复:]
SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值。
100%安全么
[/Quote]
绝对安全,我的程序里是这样用的
fihuang 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lcw321321 的回复:]

安全是指返回的值有可能不是当时增加的那条记录的值是不?
如果是这样的话,那还真不安全。除非提高数据库的隔离等级。或者自己写一个自动增长列了。
[/Quote]我说的安全就是这个意思。当很多用户同时插入的时候,返回的值有没有可能不是当时增加的那条记录的值。如果插入和返回值都是放在一个存储过程里的,这样是不是100%的安全?
fihuang 2010-06-12
  • 打赏
  • 举报
回复
SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值。
100%安全么
beifengchuiqi 2010-06-11
  • 打赏
  • 举报
回复
没有吧。。。
fihuang 2010-06-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dawugui 的回复:]

1.一般来说,使用identity(int,1,1)或手工设置自增列.

2.如果是多用户操作,哪个都不安全.所以我从来不用所谓的自增列.
[/Quote]不用自动增长列,那有什么方式可以替代吗?oracle里有序列,sqlserver里没有。
永生天地 2010-06-11
  • 打赏
  • 举报
回复
SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值。

这个得到刚刚插入的自增值

其他的也应该会有其他用处
xiaoliaoyun 2010-06-11
  • 打赏
  • 举报
回复
1. IDENTITY(1,1)可以设置自动增长. NEWSEQUENTIALID ()创建大于先前通过该函数生成的任何 GUID 的 GUID

2. 你插入一条数据以后,马上用 SCOPE_IDENTITY来获取插入的值.
dawugui 2010-06-11
  • 打赏
  • 举报
回复
1.一般来说,使用identity(int,1,1)或手工设置自增列.

2.如果是多用户操作,哪个都不安全.所以我从来不用所谓的自增列.

34,587

社区成员

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

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