[交流]自增号

txlicenhe 2003-11-07 11:56:31
加精
若有错漏,请指正或补充
...全文
48 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
txlicenhe 2003-11-13
  • 打赏
  • 举报
回复
--自已做标识列的例子:

--创建得到最大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

txlicenhe 2003-11-10
  • 打赏
  • 举报
回复

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()





owenszc 2003-11-08
  • 打赏
  • 举报
回复
极品。。。那1分能不能送个我呀。。呵呵。。开个玩笑
txlicenhe 2003-11-08
  • 打赏
  • 举报
回复
第一种写法:如果一起运行,出错后下一句还能运行(相当于没有语法错误)
第二种写法:如果一起运行,会直接出错,所有语句都没有运行。(相当于有语法错误)
wzh1215 2003-11-08
  • 打赏
  • 举报
回复
不是一起运行,
是一条一条的执行的!
同样是失败,失败原因不同导致结果不同!
txlicenhe 2003-11-08
  • 打赏
  • 举报
回复
to: wzh1215(四脚蛇)

第一种写法:如果一起运行,出错后下一句还能运行
第二种写法:如果一起运行,会直接出错,所有语句都没有运行。
wzh1215 2003-11-08
  • 打赏
  • 举报
回复
那这个呢?
create table #aa(id int identity (1,1) not null,field1 int,field2 varchar(10))
insert into #aa values(1,'aaa')
insert into #aa values(2,'bbb')
insert into #aa values(a,'ccc')
insert into #aa values(4,'eee')
select * from #aa
drop table #aa
结果:
id field1 field2
----------- ----------- ----------
1 1 aaa
2 2 bbb
3 4 eee

(3 row(s) affected)
zjcxc 2003-11-08
  • 打赏
  • 举报
回复
to: wzh1215(四脚蛇)
自增号是这样的.有插入就会增加,不管是否失败
frogshero 2003-11-08
  • 打赏
  • 举报
回复
good,thanks
wzh1215 2003-11-08
  • 打赏
  • 举报
回复
我在对有自动增长的列进行插入数据时,有时插入失败时,自动编号也会增加,真是不可理解。
如:
create table #aa(id int identity (1,1) not null,field1 int,field2 varchar(10))
insert into #aa values(1,'aaa')
insert into #aa values(2,'bbb')
insert into #aa values(3,'ccccccccccccc')
insert into #aa values(4,'eee')
select * from #aa
drop table #aa
结果为:
id field1 field2
----------- ----------- ----------
1 1 aaa
2 2 bbb
4 4 eee

(3 row(s) affected)
zjcxc 2003-11-08
  • 打赏
  • 举报
回复
错误的级别不同,你观察出错提示就知道了.

第一种写法产生的错误是可以忽略的错误,下面的语句可以再执行下去.
这种错误是发生在数据存储进行的时候,发现存储长度问题,这时相当于插入了记录,再回滚.
所以id增加

第一种写法产生的错误是不可以忽略的错误,下面的语句根本不会再执行下去.
这种错误是发生在准备进行数据存储的时候,既然没有产生存储动作,当然id不会增加
zarge 2003-11-08
  • 打赏
  • 举报
回复
lvltt 2003-11-07
  • 打赏
  • 举报
回复
收藏 学习
Dennis618 2003-11-07
  • 打赏
  • 举报
回复
大家交流一下,如果有空缺会自己填上,自动递增。
select (case when isnull((select min(id) as id from 物品 where 编号=1),0)=0 then 1 else isnull(min(编号),0)+1 end) as ID from 物品 a where not exists(select 1 from 物品 where 编号=a.编号+1)
txlicenhe 2003-11-07
  • 打赏
  • 举报
回复
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()
txlicenhe 2003-11-07
  • 打赏
  • 举报
回复
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 ...这些时间改成排班时间就更好了。


txlicenhe 2003-11-07
  • 打赏
  • 举报
回复
1: 自增列 类型为:int identity(1,1) 当然也可以是bigint,smallint
eg: create table tbName(id int identity(1,1),description varchar(20))
或在用企业管理器设计表字段时,将字段设为int,将标识设为是,其它用默认即可

2: 查询时加序号:
a:没有主键的情形:
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
zjcxc 2003-11-07
  • 打赏
  • 举报
回复
看看.
911853 2003-11-07
  • 打赏
  • 举报
回复
看看
txlicenhe 2003-11-07
  • 打赏
  • 举报
回复
大家有好的也往上面贴啊。
加载更多回复(1)
【资源说明】 基于Python Tkinter的学生管理系统源码(怎删改查、点名等)+sql数据库+项目说明.zip 基于Python Tkinter的学生管理系统,有最基本的增删改查功能,还有随机点名、顺序点名功能 1、研究现状综述 目前,在学生信息管理领域,各大高校面临的难题在于对学生信息管理的效率过低,传统的人工管理造成了资金和劳动力的浪费。因此,大部分学者研究的是针对高校的学生信息或成绩管理系统,而用python语言的也很少,其中大多用的是PyQt5模块。而且,针对低年级小学生的具有点名功能的学生管理系统基本没有。 2、可行性分析 根据市场上所具有的学生管理系统得,目前市面上的学生管理系统大多是具有增删查改等几部分内容,所面向的群体是中高校的教师群体,最主要的功能是教师方便管理学生的信息。而本设计是面向小学低年级学生的管理系统,其中最重要的功能是随机点名,顺序点名功能等,其目的是增加教师上课时的趣味性,激发学生们回答问题的兴趣。 3、重点/思路 - 连接数据库。使用第三方工具Navicat连接MySQL。 - 创建student表 - python连接数据库 - 主页设计。使用Tkinter. - 点名系统时学生姓名名单的加载实现。 - 点名系统模式切换实现。通过if语句赋值判断模式。 - 点名抽取历史查看实现。先定义一个空列表,然后将取得的学生姓名加载到空列表即可。 4、实现 # 4.1 在MySQL中新建数据库和数据表 新建students_db数据库: ```mysql CREATE DATABASE students_db CHARACTER SET utf8 COLLATE utf8_general_ci; ``` 新建students数据表存放学生信息,有学,姓名,年龄,性别,电话字段: ```mysql CREATE TABLE students ( id VARCHAR(4) NOT NULL, name VARCHAR(20) NOT NULL, age INT NOT NULL, gender VARCHAR(2) NOT NULL, phone VARCHAR(20) NOT NULL, PRIMARY KEY (id) ); ``` 新建user用户表,存放登录用户信息,有自增id、账、密码三个字段: ```mysql CREATE TABLE User ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(255) UNIQUE NOT NULL, password_hash VARCHAR(32) NOT NULL ); ``` 新建history表,存放点名记录,有自增id、点名日期、姓名三个字段: ```mysql CREATE TABLE history ( id INT NOT NULL AUTO_INCREMENT, date DATE NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY (id) ); ``` 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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