自动生成n位ID号码问题!
我不是太懂数据库
所以问题可能很苯但希望得到帮助,谢谢
如果我想生成一个n位的id号做为primarykey
3个条件
1:用数据库脚本实现,不是用java代码实现,因为代码实现我会
2:n由用户决定,比如我想要求生成3位的就可以生成3位的n的范围可以提前限定 比如规定3-5
3:因为其id作为primarykey不可以重复。
希望会的朋友帮帮忙,感激不尽!
[解决办法]
create table aa(id varchar(10) )declare @n intdeclare @v varchar(100)set @n=3zhai:select @v=left(rand()*1000000,@n)if not exists(select 1 from aa where id=@v)begininsert into aa select @vendelsebegingoto zhaiendselect * from aa920695288869432779452
[解决办法]
实现你的要求很好用,但是如果规定是整型的数,并且用rand随机生成的,则重复的概率很大的,不可能作为主键用的,你可以用自增的数字,或者你可以用三位字符串,字符串是由字母和数字组成。
给个随机的
declare @n intset @n=3if @n=3begin select cast((1000)*rand(checksum(newid())) as int) --三位endif @n=4beginselect cast((10000)*rand(checksum(newid())) as int) --四位end如果字符与数字的组合declare @n intset @n=3if @n=3begin select left(newid(),3) --三位endif @n=4beginselect left(newid(),4) --四位end
[解决办法]
[code=SQL][/code]
--编号表
CREATE TABLE tb_NO(
Name char(2) PRIMARY KEY, --编号种类的名称
Head nvarchar(10) NOT NULL DEFAULT '', --编号的前缀
CurrentNo int NOT NULL DEFAULT 0, --当前编号
BHLen int NOT NULL DEFAULT 6, --编号数字部分长度
DESCRIPTION NVARCHAR(50)) --编号种类说明
INSERT tb_NO SELECT 'CG','CG',0,4,N'采购订单'
UNION ALL SELECT 'CJ','CJ',0,4,N'采购进货'
UNION ALL SELECT 'JC','JC',0,4,N'进仓单'
UNION ALL SELECT 'ZC','ZC',0,4,N'转仓单'
UNION ALL SELECT 'CC','CC',0,4,N'出仓单'
GO
--获取新编号的存储过程
CREATE PROC p_NextBH
@Name char(2), --编号种类
@BH nvarchar(20) OUTPUT --新编号
AS
BEGIN TRAN
UPDATE tb_NO WITH(ROWLOCK) SET
@BH=Head+RIGHT(POWER(10,BHLen)+CurrentNo+1,BHLen),
CurrentNo=CurrentNo+1
WHERE Name=@Name
COMMIT TRAN
GO
--获取 CJ 的新编号
DECLARE @bh char(6)
EXEC p_NextBH 'CJ',@bh OUT
SELECT @bh
--结果: CJ0001
EXEC p_NextBH 'CJ',@bh OUT
SELECT @bh
--结果: CJ0002
GO
--获取 CC 的新编号
DECLARE @bh char(6)
EXEC p_NextBH 'CC',@bh OUT
SELECT @bh
--结果: CC0001
EXEC p_NextBH 'CC',@bh OUT
SELECT @bh
--结果: CC0002