`
wyf
  • 浏览: 435639 次
  • 性别: 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数据库在处理自增号码时,常常需要生成带有特定前缀的唯一编号,这在诸如生成邀请码、订单号或序列号等场景中非常常见。本文将深入解析Oracle中创建动态前缀且自增号码的函数,以满足这类需求。 首先,让我们...

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

    ### 如何通过C#实现单据号码的自动增加 在许多业务系统中,单据编号的自动生成是一项常见的需求。合理的编号规则不仅能够方便管理和追踪,还能体现系统的专业性和规范性。本文将详细介绍如何利用C#语言来实现单据...

    自定义字符串自增java

    字符串的自增,自定义格式,可实现项目中由程序实现VARCHAR类型的主键自增

    bat中for循环,实现变量自增的2种方式

    注意,启用延迟环境变量扩展后,变量的引用需使用感叹号而不是百分号。 以上两种方法都可以有效地在BAT脚本中实现变量的自增。第一种方法适用于不需要在循环体内修改变量的情况,而第二种方法则提供了更大的灵活性...

    NET 流水号的生成源代码(附数据库)

    通常,流水号可以是自增的整数,每次插入新记录时自动递增。在SQL数据库中,可以通过创建一个带有`IDENTITY`属性的字段来实现这一功能。例如: ```sql CREATE TABLE MyTable ( Id INT IDENTITY(1,1) PRIMARY KEY, ...

    Oracle主键自增的办法

    在 Oracle 数据库中,与许多其他关系型...这种方法适用于那些需要自动生成唯一标识符的情况,比如主键或业务流水号。需要注意的是,虽然这种方法很实用,但在高并发环境下可能需要考虑序列值的并发问题,以及性能优化。

    NET 如何进行流水号的生成的案例及源代码(附数据库)

    一种常见的方法是基于时间戳和自增序列结合,确保每次生成的流水号都是唯一的。例如,我们可以使用当前时间的毫秒数加上一个自增序列,通过一定的格式化处理,形成易于识别的流水号。在C#中,可以利用`DateTime.Now....

    php 根据自增id创建唯一编号类

    本篇文章将详细介绍如何创建一个基于自增ID的唯一编号类,并通过算法说明和实例演示来阐述其工作原理。 首先,我们要明确目标:创建一个PHP类,它接受自增ID、自定义前缀和位数作为参数,然后生成一个唯一的编号。...

    SQLserver中按年月日生成日期型自增编码.pdf

    SQL Server 中按年月日生成日期型自增编码 本文档介绍了在 SQL Server 中生成日期型自增编码的方法,通过创建两个函数 `GenCustomCode` 和 `GenCustomID`,可以生成按年月日的日期型自增编码。该方法可以应用于各种...

    Oracle使用序列创建自增字段

    ### Oracle 使用序列创建自增字段 在数据库设计与开发中,自增字段是十分常见的需求之一,尤其是在需要为每一行记录自动分配一个唯一编号的情况下。Oracle 数据库通过序列(Sequence)这一特性支持自增字段的实现。...

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

    初始化原子整型为0,每次生成订单号时自增1,然后取其值作为流水号: ```java AtomicInteger sequence = new AtomicInteger(0); int seqNum = sequence.incrementAndGet(); ``` 流水号可以添加前导0,使其保持...

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

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

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

    "AutoIncreaseVer_VC项目的版本号自增工具源码"是一个专门针对这种情况设计的实用工具,它能够自动化处理VC项目中的版本号更新,提高开发效率。 该工具的核心功能是自动增加版本号,这对于持续集成和发布新版本的...

    Mysql面试题主键自增

    2. 订单ID:电子商务平台中,每个订单的订单号一般也是自增生成。 3. 日志记录:在日志表中,自增主键可以方便地按照插入顺序进行追踪。 四、主键自增的注意事项 1. 数据库性能:自增主键有利于B树索引的构建,提高...

    MySQL自增字段为何报错.pdf

    使用命令查看自增字段当前值,并将其修改为大于当前值的一些,以跳过有错误的记录号。 2. 修改自增字段类型 如果自增字段类型设置不正确,需要将其修改为正确的类型,例如将Tinyint类型修改为INT或BIGINT类型。 ...

    订单号的生成redis中获取

    这可能包括设置一个自增的键(key),每次生成订单号时递增该键的值,以保证唯一性。 `JedisTemple.java`可能是对Jedis库的封装,Jedis是Java操作Redis的一个常用客户端。这个类可能包含了各种Redis操作的模板方法...

    SAP自定义自增ID序号及调用代码

    ### 三、程序生成自增ID号 为了在程序中使用自定义的自增ID,需要编写相应的ABAP代码。下面是一个示例代码段,展示了如何通过调用SAP内置函数模块来实现自增ID的生成: ```abap DATA: p_id TYPE zaccid. DATA: p_...

    C#生成流水号小代码

    ### C#生成流水号小代码知识点解析 #### 一、代码功能概述 这段代码主要实现了在C#中自动生成带有日期的流水号的功能。流水号通常用于标识唯一性记录,例如订单编号、文档编号等。该代码通过结合当前日期与递增的...

Global site tag (gtag.js) - Google Analytics