数据库中主键如何实现随日期自动增长

zfwjh 2008-10-19 11:21:20
如:今天是2008年10月19日.我想自动生成的ID号为:20081019+三位数.后面三位是自动增加的.
哪位大侠.帮个忙.谢谢了.
...全文
352 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zfwjh 2008-10-19
  • 打赏
  • 举报
回复
谢谢 OK了.
-狙击手- 2008-10-19
  • 打赏
  • 举报
回复
create function f_str()
returns varchar(16)
as
begin
declare @s varchar(16)
select @s = max( id ) from ta where left(id,8) = convert(char(8),getdate(),112)
if @s is null
set @s = convert(char(8),getdate(),112)+'001'
else
set @s = left(@s,8) + right('000'+ ltrim(cast(right(@s,3) as int) + 1),3)
return @s
end
go

create table ta(id varchar(16) default dbo.f_str(),col int)
go
insert into ta values(default,100)
insert into ta values(default,100)
insert into ta values(default,100)
insert into ta values(default,100)

select * from ta
drop table ta

drop function f_str

/*
id col
---------------- -----------
20081019001 100
20081019002 100
20081019003 100
20081019004 100
*/
liangCK 2008-10-19
  • 打赏
  • 举报
回复
--以下代码生成的编号长度为12,前6位为日期信息,格式为YYMMDD,后6位为流水号。
--创建得到当前日期的视图
CREATE VIEW v_GetDate
AS
SELECT dt=CONVERT(CHAR(6),GETDATE(),12)
GO

--得到新编号的函数
CREATE FUNCTION f_NextBH()
RETURNS char(12)
AS
BEGIN
DECLARE @dt CHAR(6)
SELECT @dt=dt FROM v_GetDate
RETURN(
SELECT @dt+RIGHT(1000001+ISNULL(RIGHT(MAX(BH),6),0),6)
FROM tb WITH(XLOCK,PAGLOCK)
WHERE BH like @dt+'%')
END
GO

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

--插入资料
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)

--显示结果
SELECT * FROM tb
/*--结果
BH col
------------------- -----------
050405000001 1
050405000002 2
050405000003 4
050405000004 14
--*/
liangCK 2008-10-19
  • 打赏
  • 举报
回复
--生成流水号

--创建测试表
create table test(id varchar(18), --流水号,日期(8位)+时间(4位)+流水号(4位)
name varchar(10) --其他字段
)

go
--创建生成流水号的触发器
create trigger t_insert on test
INSTEAD OF insert
as
declare @id varchar(18),@id1 int,@head varchar(12)
select * into #tb from inserted
set @head=convert(varchar,getdate(),112)+replace(convert(varchar(5),getdate(),108),':','')
select @id=max(id) from test where id like @head+'%'
if @id is null
set @id1=0
else
set @id1=cast(substring(@id,13,4) as int)
update #tb set @id1=@id1+1
,id=@head+right('0000'+cast(@id1 as varchar),4)
insert into test select * from #tb
go


--插入数据,进行测试
insert into test(name)
select 'aa'
union all select 'bb'
union all select 'cc'

--修改系统时间,再插入数据测试一次
insert into test(name)
select 'aa'
union all select 'bb'
union all select 'cc'

--显示测试结果
select * from test


--删除测试环境
drop table test

/*--测试结果
id name
------------------ ----------
2004022720430001 aa
2004022720430002 bb
2004022720430003 cc
2004022720430004 aa
2004022720430005 bb
2004022720430006 cc

(所影响的行数为 6 行)
--*/
-狙击手- 2008-10-19
  • 打赏
  • 举报
回复
1、前台程序生成
2、缺省
3、instead of trigger

34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧