日期:2014-05-18  浏览次数:20470 次

自动生成n位ID号码问题!
我不是太懂数据库 
所以问题可能很苯但希望得到帮助,谢谢
如果我想生成一个n位的id号做为primarykey
3个条件
1:用数据库脚本实现,不是用java代码实现,因为代码实现我会
2:n由用户决定,比如我想要求生成3位的就可以生成3位的n的范围可以提前限定 比如规定3-5
3:因为其id作为primarykey不可以重复。
希望会的朋友帮帮忙,感激不尽!

------解决方案--------------------
SQL code


create table aa(id varchar(10) )

declare @n int
declare @v varchar(100)

set @n=3
zhai:
select  @v=left(rand()*1000000,@n)

if not exists(select 1 from aa where id=@v)
begin
insert into aa select @v
end
else
begin
goto zhai
end
select * from aa

920
695
288
869
432
779
452

------解决方案--------------------
实现你的要求很好用,但是如果规定是整型的数,并且用rand随机生成的,则重复的概率很大的,不可能作为主键用的,你可以用自增的数字,或者你可以用三位字符串,字符串是由字母和数字组成。
给个随机的
SQL code

declare @n int
set @n=3
if @n=3
begin 
select cast((1000)*rand(checksum(newid())) as int) --三位
end
if @n=4
begin
select cast((10000)*rand(checksum(newid())) as int) --四位
end

如果字符与数字的组合
declare @n int
set @n=3
if @n=3
begin 
select left(newid(),3) --三位
end
if @n=4
begin
select 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