在sql中,有没有办法让ID是由字母和数字组成,并且数字可以自动增长

在sql中,有没有办法让ID是由字母和数字组成,并且数字可以自动增长,第1张

--下面的代码生成长度为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

--*/ --另一种方法--种子表 num_tb

if object_id('num_tb') is not null

drop table num_tb

go

create table num_tb(d datetime,id int)

insert num_tb select getdate(),1

if object_id('tb') is not null

drop table tb

go

create table tb(id varchar(20),name varchar(10))

create clustered index idx_clu_tb on tb(id)

go

create trigger tri_tb on tb INSTEAD OF INSERT

as

begin

set nocount on

declare @i int,@id varchar(20),@j int

select @i=count(*) from inserted

begin tran

update num_tb with(TABLOCKX) set

id=(case when convert(char(8),d,112)=convert(char(8),getdate(),112)

then id+@i else @i end),

@j=(case when convert(char(8),d,112)=convert(char(8),getdate(),112) then id else 0 end),

d=getdate()

commit tran

select * into #t from inserted

update #t set id=convert(varchar(8),getdate(),112)+right('00000'+rtrim(@j),5),@j=@j+1

insert tb select * from #t

end

go

--插入记录测试

insert into tb(name) values('张三')

insert into tb(name) values('李四')

select * from tb

/*

id name

-------------------- ----------

2010012700002张三

2010012700003李四

*/

insert into tb select '2010012700003','王五'

/*

id name

-------------------- ----------

2010012700002张三

2010012700003李四

2010012700004王五

*/

这里Oracle数据库使用命令行 *** 作,注意Oracle不能直接设置自增字段,需要使用序列+触发器来实现。

1.创建Book表

Create table Book(

Id NUMBER(6) constraint s_PK primary key,

Title nvarchar2(200) not null,

Author nvarchar2(200) not null,

Publisher nvarchar2(200) not null,

ISBN nvarchar2(50) not null,

Price NUMBER(6,2) not null,

CategoryName nvarchar2(50) not null,

Description nvarchar2(1000) not null,

ImageName varchar2(50)

)

2.创建自增序列

create sequence BOOK_seq(BOOK_seq为序列名,任意取)

increment by 1 (increment 表示字段逐条增加1)

start with 1(设置自增序列的初始值为1)

nomaxvalue (不限制自增序列的最大值)

minvalue 1 (设置自增序列的最小值为1)

3.试用一下,向BOOK表中插入一条数据,Id列就引用了自增序列。

insert into BOOK values(BOOK_seq.nextval,'a','a','a','a',32.1,'a',

'a','1.jpg')

注意:

*** 作之后记得输入“commit“保存 *** 作。

Oracle数据库的的命令行创建表,系统会自动转化为大写字母,假如使用数据库 *** 作客户端,那么建表等 *** 作时记得字段名大写。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6770702.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-28
下一篇 2023-03-28

发表评论

登录后才能评论

评论列表(0条)

保存