热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何使sqlserverint主键列自动递增(不是标识符)?

如何使sqlserverint主键列自动递增(同时不是标识符)?比如说主键列为ID,在不能把他设置为标识符的情况下利用存储过程让它自动递增,求方法和代码
如何使sqlserver int主键列自动递增(同时不是标识符)?

比如说主键列为ID,在不能把他设置为标识符的情况下利用存储过程让它自动递增,求方法和代码

10 个解决方案

#1


在学习中遇到这个问题 
数据库里有编号字段 
BH00001 
BH00002 
BH00003 
BH00004 
如何实现自动增长

 

--下面的代码生成长度为8的编号,编号以BH开头,其余6位为流水号。
--得到新编号的函数
CREATE FUNCTION f_NextBH()
RETURNS char(8)
AS
BEGIN
    RETURN(SELECT 'BH'+RIGHT(1000001+ISNULL(RIGHT(MAX(BH),6),0),6) FROM tb WITH(XLOCK,PAGLOCK))
END
GO

--在表中应用函数
CREATE TABLE tb(
BH char(8) PRIMARY KEY DEFAULT dbo.f_NextBH(),
col int)

--插入资料
BEGIN TRAN
    INSERT tb(col) VALUES(1)
    INSERT tb(col) VALUES(2)
    INSERT tb(col) VALUES(3)
    DELETE tb WHERE col=3
    INSERT tb(col) VALUES(4)
    INSERT tb(BH,col) VALUES(dbo.f_NextBH(),14)
COMMIT TRAN

--显示结果
SELECT * FROM tb
/*--结果
BH         col 
---------------- ----------- 
BH000001  1
BH000002  2
BH000003  4
BH000004  14
--*/

 

create table tb
(id int identity,
name varchar(10),
code as 'BH'+right('0000'+cast(id as varchar),5))
go
insert tb(name) select 'A'
union all select 'B'
union all select 'C'
union all select 'D'

select * from tb

drop table tb

/*
id          name       code         
----------- ---------- ------------ 
1           A          BH00001
2           B          BH00002
3           C          BH00003
4           D          BH00004

(所影响的行数为 4 行)
*/

#2


我只需要实现主键列ID在不是标识的情况下,实现自动增长

#3


引用楼主 huangkai8311130 的回复:
如何使sqlserver int主键列自动递增(同时不是标识符)?

比如说主键列为ID,在不能把他设置为标识符的情况下利用存储过程让它自动递增,求方法和代码


LZ 可否使用计算列。添加一个标识列,然后用计算列的方式实现递增的自设定字段。

#4


利用储发器 set id=max(id)+1

#5


该回复于2011-07-05 11:23:32被版主删除

#6


引用 3 楼 orchidcat 的回复:
引用楼主 huangkai8311130 的回复:
如何使sqlserver int主键列自动递增(同时不是标识符)?

比如说主键列为ID,在不能把他设置为标识符的情况下利用存储过程让它自动递增,求方法和代码


LZ 可否使用计算列。添加一个标识列,然后用计算列的方式实现递增的自设定字段。

假如我的建立了一个标识列ID2,那么ID该如何利用存储过程来计算出来呢?
比如目前表为       ID  name  ID2(标识列)
                 1   张三    1
                 2   李四    2
我插入第三条数据  null  王五    3
现在要在我插入第三条数据时或者一次加多条数据时让ID能自动的根据ID2来填上
请给出相关存储过程。

#7


create table tb(id int identity(1,1) not null,
col1 nvarchar(10) not null,
not_identity int not null PRIMARY KEY
)
go
create procedure setidentity
(@col varchar(10))
as
begin
insert into tb select @col,isnull((select not_identity+1 from tb),1)
end
go
exec setidentity 'abcd'
exec setidentity 'efgh'
go
select * from tb
/*
id          col1       not_identity
----------- ---------- ------------
1           abcd       1
2           efgh       2

(2 行受影响)

*/
drop table tb
drop procedure setidentity

#8


修正:
create table tb(id int identity(1,1) not null,
col1 nvarchar(10) not null,
not_identity int not null PRIMARY KEY
)
go
create procedure setidentity
(@col varchar(10))
as
begin
insert into tb select @col,isnull((select max(not_identity)+1 from tb),1)
end
go
exec setidentity 'abcd'
exec setidentity 'efgh'
exec setidentity 'ijkl'
go
select * from tb
/*
id          col1       not_identity
----------- ---------- ------------
1           abcd       1
2           efgh       2
3           ijkl       3

(3 行受影响)

*/
drop table tb
drop procedure setidentity

#9


请问能不能使用某个SQL语句来设定表TABLE内的ID列为标识,同样使用语句来取消他的标识呢?

#10


引用 9 楼 huangkai8311130 的回复:
请问能不能使用某个SQL语句来设定表TABLE内的ID列为标识,同样使用语句来取消他的标识呢?

Alter table tbname Alter column 命令

推荐阅读
author-avatar
lin
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有