`
wyf
  • 浏览: 424956 次
  • 性别: Icon_minigender_1
  • 来自: 唐山
社区版块
存档分类
最新评论

自增号

    博客分类:
  • SQL
阅读更多
1: 自增列 类型为:int identity(1,1) 当然也可以是bigint,smallint 
eg: create table tbName(id int identity(1,1),description varchar(20)) 
或在用企业管理器设计表字段时,将字段设为int,将标识设为是,其它用默认即可

IDENTITY (给SQL 的 select 语句添加一个自动递增的ID字段)
select id1=identity(int,1,1) , * into #test from tb 
select * from #test

@@identity是表示的是最近一次向具有identity属性(即自增列)的表插入数据时对应的自增列的值,是系统定义的全局变量。一般系统定义的全局变量都是以@@开头,用户自定义变量以@开头。比如有个表A,它的自增列是id,当向A表插入一行数据后,如果插入数据后自增列的值自动增加至101,则通过select @@identity得到的值就是101。使用@@identity的前提是在进行insert操作后,执行select @@identity的时候连接没有关闭,否则得到的将是NULL值。
 


我的例子:--查询时加子增列(需要用到)
select identity(int,1,1) as id,newid() as Guid,qq into #tp from QQ--(QQ(qq(nvarchar(11))))

select * from #tp

drop table #tp
select @@identity

2: 查询时加序号: 
a:没有主键的情形: (注意语法:Select identity(int,1,1) as iid,* into #tmp from TableName   )
Select identity(int,1,1) as iid,* into #tmp from TableName 
Select * from #tmp 
Drop table #tmp 
b:有主键的情形: 
Select (Select sum(1) from TableName where KeyField <= a.KeyField) as iid,* from TableName a   
3:生成自增序列号的表 
eg: 生成一列0-30的数 
Select top 30 (select sum(1) from sysobjects where name<= a.name)-1 as id from sysobjects a 

当然,可能sysobjects 中没有这么多条记录,比如只有100条,我需生成1-800的序列号 
如下处理: 
Select (Select sum(1) from (Select top 800 a.name as name1,b.name as name2 from sysobjects a ,sysobjects b) cc where name1<= dd.name1 and name2 <= dd.name2 ) from 
(Select top 800 a.name as name1,b.name as name2 from sysobjects a ,sysobjects b) dd 


应用举例 
eg1: 
create table t(日期 char(8),请假人数 int) 
insert t select '20031001',3 
Union all select '20031003',2 
Union all select '20031004',1 
Union all select '30031031',5 
要列出2003年10月每一天的请假人数,若没有,以0表示。 

Select convert(char(8),dateadd(day,id,'20031001'),112),IsNull(t.请假人数,0) from 
(Select top 31 (select sum(1) from sysobjects where name<= a.name)-1 as id from sysobjects a) bb 
left join t on convert(char(8),dateadd(day,id,'20031001'),112) = t.日期 



eg2: 生成随机考勤打卡资料: 

declare @r int 
--得到要处理的记录数 
set @r=900 

--创建得到随机时间的临时表 
create table #tb(id int identity(1,1),dt1 datetime,dt2 datetime,dt3 datetime,dt4 datetime,dt5 datetime,dt6 datetime) 

--生成随机时间 
declare @sql varchar(8000) 
set @sql='insert into #tb(dt1,dt2,dt3,dt4,dt5,dt6) select top '+cast(@r as varchar)+' 
dateadd(ss,rand(a.id)*1800,''07:30''), 
dateadd(ss,rand(a.id+1)*400,''11:30''), 
dateadd(ss,rand(a.id+2)*1600,''13:00''), 
dateadd(ss,rand(a.id+3)*300,''17:30''), 
dateadd(ss,rand(a.id+4)*800,''17:45''), 
dateadd(ss,rand(a.id+5)*250,''20:00'') 
from(select top 100 id from sysobjects) a, 
(select top 9 id from sysobjects) b 
order by newid() 
exec(@sql) 
当然,如果将07:30 11:30 ...这些时间改成排班时间就更好了。   
4: 好多单号都是自动增长,但又不能用自增列代替 
eg: P031106001 -- 第一位P表示采购单,031106表示日期,后三位是流水号。  
 如下处理:(编号规则不同时稍加修改即可) 

先建一个自定义函数 
create function getDH() 
returns char(10) 
As 
begin 
declare @dh1 char(10),@dh2 char(10) 
select @dh1 = max(dh) from tableName 
Set @dh1 = IsNull(@dh1,'P000000000') 
set @dh2 = Left(@dh1,1) + right(convert(varchar(8),getdate(),112),6) + '001' 
if @dh1 >= @dh2 
begin 
set @dh2 = left(@dh1,7) + right('000'+ cast(cast(right(@dh1,3) as int)+1 as varchar),3) 
end 
return(@dh2) 
end 

/******** 
Usage: select dbo.getdh() 
*******/ 

然后在字段默认值中填入 dbo.getdh()


4: 好多单号都是自动增长,但又不能用自增列代替 
eg: P031106001 -- 第一位P表示采购单,031106表示日期,后三位是流水号。  
 如下处理:(编号规则不同时稍加修改即可) 

因在自定义函数内不能用getdate(),先建一个视图 
create view vGetdate 
as 
select getdate() as today 


先建一个自定义函数 
create function getDH() 
returns char(10) 
As 
begin 
declare @dh1 char(10),@dh2 char(10) 
select @dh1 = max(dh) from tableName 
Set @dh1 = IsNull(@dh1,'P000000000') 
select @dh2 = Left(@dh1,1) + right(convert(varchar(8),today,112),6) + '001' from vGetdate 
if @dh1 >= @dh2 
begin 
set @dh2 = left(@dh1,7) + right('000'+ cast(cast(right(@dh1,3) as int)+1 as varchar),3) 
end 
return(@dh2) 
end 

/******** 
Usage: select dbo.getdh() 
*******/ 

然后在字段默认值中填入 dbo.getdh()   
--自已做标识列的例子: 

--创建得到最大id的函数 
create function f_getid() 
returns int 
as 
begin 
declare @id int 
select @id=max(id) from tb 
set @id=isnull(@id,0)+1 
return(@id) 
end 
go 

--创建表 
create table tb(id int default dbo.f_getid(),name varchar(10)) 
go 

--创建触发器,在删除表中的记录时,自动更新记录的id 
create trigger t_delete on tb 
AFTER delete 
as 
declare @id int,@mid int 
select @mid=min(id),@id=@mid-1 from deleted 
update tb set id=@id,@id=@id+1 where id>@mid 
go 

--插入记录测试 
insert into tb(name) values('张三') 
insert into tb(name) values('张四') 
insert into tb(name) values('张五') 
insert into tb(name) values('张六') 
insert into tb(name) values('张七') 
insert into tb(name) values('张八') 
insert into tb(name) values('张九') 
insert into tb(name) values('张十') 

--显示插入的结果 
select * from tb 

--删除部分记录 
delete from tb where name in('张五','张七','张八','张十') 

--显示删除后的结果 
select * from tb 

--删除环境 
drop table tb 
drop function f_getid  

 

分享到:
评论

相关推荐

    oracle生成动态前缀且自增号码的函数分享

    主要介绍了oracle生成动态前缀且自增号码的函数,需要的朋友可以参考下

    如何通过C#实现单据号码的自动增加

    如何通过C#实现单据号码的自动增加

    AutoIncreaseVer_VC项目的版本号自增工具源码_

    功能说明: 实现VC工程的版本号自增 它有如下特点: 1. 它修改.rc文件源文件,便于文件归档; 2. 当工程无修改时,版本号维持不变,工程将不会生成新文件; 3. 支持配置自增的字段;(如A.B.C.D, 命令行-pos参数为4...

    AutoIncreaseVer_VC项目的版本号自增工具源码_源码.zip

    AutoIncreaseVer_VC项目的版本号自增工具源码_源码

    xiaogliu#step-by-step#02.重写console.log1

    题目:写一段代码,扩展 console.log,在每个输出前添加一个自增号,比如:解答:ES6 解法:// ES6 剩余参数// 箭头函数节省代码console

    GradleSample:一个渐变模板,包括自动签名,版本号自增,多渠道打包

    GradleSample一个Android Studio项目的gradle模板,包括自动签名,版本号自增,多渠道打包

    每次vc编译时自动增加版本号

    vc每次编译时,自动递增版本号信息 自己再vs2005下试验过,没有问题 使用方法: 将modifyver.exe拷到系统目录下(例如windows下) 在vc的预生成事件中加上“modifyver.exe $(ProjectName).rc” 思路是修改rc文件,用...

    c#后台生成不重复的订单号及后台存储过程

    SQL,C#,不重复编码,订单号 1. C#后台封装方法 通用获取最大单据编号, 可以生成以下3个类型的单号 CG1603-000001 CG201603-000001 CG20160321-000001

    vc 版本号自动增加

    该工具代码包括两个功能:vc工程版本号自动更新、对pe文件进行检查和计算。 调用命令行格式: VCMakeHelper.exe /UpdateVersion:"E:\111\MFCApplication2\MFCApplication2.rc" VCMakeHelper.exe /UpdateChecksum:...

    vc编译自动增加版本号

    vc每次编译时,自动递增版本号信息,vs2005下试验过。 环境 需要在本机安装TortoiseSVN 第一步 在项目的.rc文件中搜索VS_VERSION_INFO VERSIONINFO 按照下面例子更改 VS_VERSION_INFO VERSIONINFO #ifdef _AUTO_...

    使用SVN实现版本号自增

    火龙果软件工程技术中心 在《介绍一下SVN》一文中,我提到了自动递增版本号的功能,现在就来具体说明一下实现方法。虽然标题中说的是“使用SVN”,但我们实际用的是SVN的客户端工具TortoiseSVN中的SubWCRev程序。...

    SQL server 自增ID–序号自动增加的字段操作

    1、SQL server中创建表,带有自增列。 create table Test_Table(Id int Identity(1,1), Name varchar(20)); 这里用到了IDENTITY 关键字。IDENTITY(a,b),a b均为正整数,a表示开始数,b表示步长。 IDENTITY(1,1)就...

    SQL Server 2008怎样添加自增列实现自增序号

    在做《机房收费系统》的时候,有的表需要添加自增列,在添加新纪录时自动添加一个序号。下面我给大家介绍两种添加方法: 一、通过T-SQL代码. 代码如下: alter table 表名 add 列名 int IDENTITY(1,1) NOT NULL 这里...

    mysql创建流水号,用的纯sql语句

    mysql创建流水号,以前也一直不知道怎么写,最后我知道了,然后我保存了下来,用的纯sql语句,不需要后台java或者别的语言去生成。直接数据库的sql语句就行了。我设置的积分是1分。要是增加了,就是CSDN增加的,

    JAVA生成订单号(日期+流水号)

    JAVA生成订单号(日期+流水号) java按日期加流水号方式生成订单号,已经测试过,可递增方式生成。

    C#生成流水号小代码

    自己写的一点小代码,多有不当,请指正! public string GetAutoDocNo() { string DocNo = "AD"; string today = DateTime.Today.Date.ToString("yyyyMMdd", DateTimeFormatInfo.InvariantInfo);...

    订单号的生成redis中获取

    NULL 博文链接:https://yuhuiblog695685688425687986842568269.iteye.com/blog/2428458

    MySQL8新特性:自增主键的持久化详解

    自增主键没有持久化是个比较早的bug,这点从其在官方bug网站的id号也可看出(https://bugs.mysql.com/bug.php?id=199)。由Peter Zaitsev(现Percona CEO)于2003年提出。历史悠久且臭名昭著。 首先,直观的重现下。...

Global site tag (gtag.js) - Google Analytics