求助数据库高手,关于SQL Server 自动编号的问题。
想知道自动编号的工作原理,请高手指点:例如,我现在有一个表叫data0016,里面有如下几个字段:RKEY,CODE,LOCATION,LOCATION_TYPE,NON...
想知道自动编号的工作原理,请高手指点:
例如,我现在有一个表叫data0016,里面有如下几个字段:RKEY,CODE,LOCATION,LOCATION_TYPE,NON_NETTABLE,ACTIVE_FLAG
其中RKEY被我设置成了自动编号的列,种子为1,增量为1.
与其相关的存储过程如下
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER PROCEDURE [dbo].[SP_INSERTDATA0016]
@CODE CHAR(5),
@LOCATION CHAR(10),
@LOCATION_TYPE FLOAT,
@NON_NETTABLE FLOAT,
@ACTIVE_FLAG FLOAT,
@DATA0016RKEY INT OUTPUT
AS
SET NOCOUNT ON;
INSERT INTO DATA0016 (
CODE,
LOCATION,
LOCATION_TYPE,
NON_NETTABLE,
ACTIVE_FLAG)
VALUES (
@CODE,
@LOCATION,
@LOCATION_TYPE,
@NON_NETTABLE,
@ACTIVE_FLAG);
IF @@ERROR = 0
BEGIN
SELECT @DATA0016RKEY= SCOPE_IDENTITY ()
RETURN 0
END
ELSE
BEGIN
SELECT @DATA0016RKEY= 0
RETURN -1
END
我想知道,当我在前台创建一条数据的时候,这个RKEY是怎么自动增加的呢,原理是什么?
麻烦大侠赐教,谢谢!
谢谢各位,不过我不是想问怎么创建一个自动编号列,我是想知道它的工作原理。
我上面的存储过程是从系统里COPY的,是可以运行的。我就是想知道这些语句的意思,比如,当在前台对应程序新建一个记录的时候,这个自动编号是怎么产生的,是先去搜寻现存表中的最大值,然后+1吗? 展开
例如,我现在有一个表叫data0016,里面有如下几个字段:RKEY,CODE,LOCATION,LOCATION_TYPE,NON_NETTABLE,ACTIVE_FLAG
其中RKEY被我设置成了自动编号的列,种子为1,增量为1.
与其相关的存储过程如下
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER PROCEDURE [dbo].[SP_INSERTDATA0016]
@CODE CHAR(5),
@LOCATION CHAR(10),
@LOCATION_TYPE FLOAT,
@NON_NETTABLE FLOAT,
@ACTIVE_FLAG FLOAT,
@DATA0016RKEY INT OUTPUT
AS
SET NOCOUNT ON;
INSERT INTO DATA0016 (
CODE,
LOCATION,
LOCATION_TYPE,
NON_NETTABLE,
ACTIVE_FLAG)
VALUES (
@CODE,
@LOCATION,
@LOCATION_TYPE,
@NON_NETTABLE,
@ACTIVE_FLAG);
IF @@ERROR = 0
BEGIN
SELECT @DATA0016RKEY= SCOPE_IDENTITY ()
RETURN 0
END
ELSE
BEGIN
SELECT @DATA0016RKEY= 0
RETURN -1
END
我想知道,当我在前台创建一条数据的时候,这个RKEY是怎么自动增加的呢,原理是什么?
麻烦大侠赐教,谢谢!
谢谢各位,不过我不是想问怎么创建一个自动编号列,我是想知道它的工作原理。
我上面的存储过程是从系统里COPY的,是可以运行的。我就是想知道这些语句的意思,比如,当在前台对应程序新建一个记录的时候,这个自动编号是怎么产生的,是先去搜寻现存表中的最大值,然后+1吗? 展开
3个回答
展开全部
自增列,类型为identity int,numeric 等整型的数据类型,又称为标识列。
一般不用给它赋值,它是自已增加的,
如果是第一行那它们连续自动增加,
如果在经常进行删除操作的表中存在着标识列,那么在标识值之间可能会有间隔。如果这是要考虑的问题,那么请不要使用 IDENTITY 属性。但是,为了确保未产生间隔,或者填补现有的间隔,在用 SET IDENTITY_INSERT ON 显式输入标识值之前,请先对现有的标识值进行计算。
如果要重新使用已删除的标识值,则可使用示例 B 中的示例代码来查找下一个可用的标识值。使用表名称、标识列数据类型和(该数据类型)的最大允许值数值 -1 来替代 tablename、column_type 和 MAX(column_type) - 1。
使用 DBCC CHECKIDENT 检查当前的标识值,并将其与标识列中的最大值进行比较。
当表记录truncate table时,表的identity则被重置。
一般不用给它赋值,它是自已增加的,
如果是第一行那它们连续自动增加,
如果在经常进行删除操作的表中存在着标识列,那么在标识值之间可能会有间隔。如果这是要考虑的问题,那么请不要使用 IDENTITY 属性。但是,为了确保未产生间隔,或者填补现有的间隔,在用 SET IDENTITY_INSERT ON 显式输入标识值之前,请先对现有的标识值进行计算。
如果要重新使用已删除的标识值,则可使用示例 B 中的示例代码来查找下一个可用的标识值。使用表名称、标识列数据类型和(该数据类型)的最大允许值数值 -1 来替代 tablename、column_type 和 MAX(column_type) - 1。
使用 DBCC CHECKIDENT 检查当前的标识值,并将其与标识列中的最大值进行比较。
当表记录truncate table时,表的identity则被重置。
展开全部
你看一下,
--编号处理之独立编号表法
/*
create table dbo.bh_max
(Name nvarchar(20) primary key,
Head nvarchar(20) not null default '',
recnum bigint not null default 0,
bhlen int not null default 8,
descriptiion nvarchar(50)
)
--初始化编号表
insert dbo.bh_max
select 'JHG','JHG',0,8,'采购开票单'
union all select 'JHA','JHA',0,8,'采购入库单'
union all select 'XSG','XSG',0,8,'销售开票单'
union all select 'XSA','XSA',0,8,'销售出库单'
go
-- 获取新编号的存储过程
alter proc dbo.p_nextbh
@name nvarchar(20),
@bh nvarchar(20) output
as
begin tran
update bh_max with(rowlock)
set @bh=head+right(power(10,bhlen)+recnum+1,bhlen),
recnum=recnum+1
where name=@name
commit tran
go
declare @bh nvarchar(20)
exec dbo.p_nextbh @name='XSA',@bh=@bh output
print @bh
select * from bh_max
--独立编号表法二,按日期生成编号 drop table no_max
create table no_max
(name nvarchar(20) not null, --编号种类的名称
days int not null, --保存的是该种编号那一天的当前编号
head nvarchar(20) not null default '', --编号的前缀
recnum int not null default 0,
bhlen int not null default 8, --编号数字部分的长度
yearmonth nvarchar(6) not null default convert(char(6),getdate(),112),
description nvarchar(50), -- 编号的种说明
tablename sysname not null, --当前编号对应的原始表
fieldname sysname not null ,
primary key(name,days)
)
--初始化编号表
insert no_max
select 'JHA',1,'JHAZDA',0,8,'200906',N'集团总部采购入库单',N'dbo.tb',N'maxbh'
union select 'JHA',2,'JHAZDA',0,8,'200906',N'集团总部采购入库单',N'dbo.tb',N'maxbh'
union select 'JHA',3,'JHAZDA',0,8,'200906',N'集团总部采购入库单',N'dbo.tb',N'maxbh'
union select 'JHA',4,'JHAZDA',0,8,'200906',N'集团总部采购入库单',N'dbo.tb',N'maxbh'
union select 'JHA',4,'JHAZDA',0,8,'200906',N'集团总部采购入库单',N'dbo.tb',N'maxbh'
union select 'JHA',6,'JHAZDA',0,8,'200906',N'集团总部采购入库单',N'dbo.tb',N'maxbh'
union select 'JHA',7,'JHAZDA',0,8,'200906',N'集团总部采购入库单',N'dbo.tb',N'maxbh'
union select 'JHA',8,'JHAZDA',0,8,'200906',N'集团总部采购入库单',N'dbo.tb',N'maxbh'
union select 'JHA',9,'JHAZDA',0,8,'200906',N'集团总部采购入库单',N'dbo.tb',N'maxbh'
union select 'JHA',21,'JHAZDA',0,8,'200906',N'集团总部采购入库单',N'dbo.tb',N'maxbh'
union select 'JHA',28,'JHAZDA',0,8,'200906',N'集团总部采购入库单',N'dbo.tb',N'maxbh'
-- select * from no_max
*/
这是我以前写的
--编号处理之独立编号表法
/*
create table dbo.bh_max
(Name nvarchar(20) primary key,
Head nvarchar(20) not null default '',
recnum bigint not null default 0,
bhlen int not null default 8,
descriptiion nvarchar(50)
)
--初始化编号表
insert dbo.bh_max
select 'JHG','JHG',0,8,'采购开票单'
union all select 'JHA','JHA',0,8,'采购入库单'
union all select 'XSG','XSG',0,8,'销售开票单'
union all select 'XSA','XSA',0,8,'销售出库单'
go
-- 获取新编号的存储过程
alter proc dbo.p_nextbh
@name nvarchar(20),
@bh nvarchar(20) output
as
begin tran
update bh_max with(rowlock)
set @bh=head+right(power(10,bhlen)+recnum+1,bhlen),
recnum=recnum+1
where name=@name
commit tran
go
declare @bh nvarchar(20)
exec dbo.p_nextbh @name='XSA',@bh=@bh output
print @bh
select * from bh_max
--独立编号表法二,按日期生成编号 drop table no_max
create table no_max
(name nvarchar(20) not null, --编号种类的名称
days int not null, --保存的是该种编号那一天的当前编号
head nvarchar(20) not null default '', --编号的前缀
recnum int not null default 0,
bhlen int not null default 8, --编号数字部分的长度
yearmonth nvarchar(6) not null default convert(char(6),getdate(),112),
description nvarchar(50), -- 编号的种说明
tablename sysname not null, --当前编号对应的原始表
fieldname sysname not null ,
primary key(name,days)
)
--初始化编号表
insert no_max
select 'JHA',1,'JHAZDA',0,8,'200906',N'集团总部采购入库单',N'dbo.tb',N'maxbh'
union select 'JHA',2,'JHAZDA',0,8,'200906',N'集团总部采购入库单',N'dbo.tb',N'maxbh'
union select 'JHA',3,'JHAZDA',0,8,'200906',N'集团总部采购入库单',N'dbo.tb',N'maxbh'
union select 'JHA',4,'JHAZDA',0,8,'200906',N'集团总部采购入库单',N'dbo.tb',N'maxbh'
union select 'JHA',4,'JHAZDA',0,8,'200906',N'集团总部采购入库单',N'dbo.tb',N'maxbh'
union select 'JHA',6,'JHAZDA',0,8,'200906',N'集团总部采购入库单',N'dbo.tb',N'maxbh'
union select 'JHA',7,'JHAZDA',0,8,'200906',N'集团总部采购入库单',N'dbo.tb',N'maxbh'
union select 'JHA',8,'JHAZDA',0,8,'200906',N'集团总部采购入库单',N'dbo.tb',N'maxbh'
union select 'JHA',9,'JHAZDA',0,8,'200906',N'集团总部采购入库单',N'dbo.tb',N'maxbh'
union select 'JHA',21,'JHAZDA',0,8,'200906',N'集团总部采购入库单',N'dbo.tb',N'maxbh'
union select 'JHA',28,'JHAZDA',0,8,'200906',N'集团总部采购入库单',N'dbo.tb',N'maxbh'
-- select * from no_max
*/
这是我以前写的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可以先创建一个序列
Create Sequence Sequence_name
start with 1
increment by 1;
当你添加数据的时候只需要添加当前的序列就可以了!代码:insert into tablename values(Sequence_names.nextval,'','',''……);最后查询就应该可以了!
Create Sequence Sequence_name
start with 1
increment by 1;
当你添加数据的时候只需要添加当前的序列就可以了!代码:insert into tablename values(Sequence_names.nextval,'','',''……);最后查询就应该可以了!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询