如何设置自动编号的深入浅出的问题??

qicaihuochai 2007-11-30 09:08:29
我的数据库是SQL2000,我想将一个字段设置成自动编号,并且自动编号的格式为:0001.即第一条记录的编号是:0001,那么自动编号的下一条记录的编号就是:0002.

并且如果在中间删除一条数据记录不影响其他编号的变化。即,记录编号从0001到1000,删除0050,其他的号码不会改变。

这个问题我曾经问过很多人都没有回答,希望各位专家,老手给与解答!!

谢谢!!
...全文
427 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
云中客 2007-12-02
  • 打赏
  • 举报
回复
--创建表
CREATE TABLE [dbo].[tb11] (
[myid] char(4) ,
[mytext] [char] (10)
)
--创建函数
CREATE FUNCTION AddCode()
RETURNS varchar(4)
As
Begin
Declare @newCode varchar(4)
Select @newCode=right(str((10000 +isnull(max(myid),0)+1)),4) from tb11
Return @newCode
End
--执行添加记录
insert into tb11 values(dbo.addcode(),'tttt')
insert into tb11 values(dbo.addcode(),'BBBB')
insert into tb11 values(dbo.addcode(),'FFFF')
insert into tb11 values(dbo.addcode(),'DDDDD')

云中客 2007-12-02
  • 打赏
  • 举报
回复
其实大家给出的例子都不错
只不过仅这样来实现存在一些问题:
1.每个表中必须存在autoid这个列,因为所需要的编码是根据这个列值生成的
2.需要生成的编码规则比较死板,例如:如果现在需要A00001.....,如果需要修改为其他前缀(B00001),就需要直接修改表

所以我觉得可以通过存储过程或函数来实现,个人感觉利用函数在insert into 语句中来实现比较好
qicaihuochai 2007-12-02
  • 打赏
  • 举报
回复
楼上的兄弟,我不是把它做为唯一列来使用的 !!
qicaihuochai 2007-11-30
  • 打赏
  • 举报
回复
騎着蝸牛逛街

我要的就是能够自动生成的那种自动编号,你会做吗?麻烦你告诉我!!

谢谢!!
areswang 2007-11-30
  • 打赏
  • 举报
回复
楼上各位的意思是:让你存的时候按自动编号1,2,3等存入,用的时候,比如要显示出来时,再进行转换一下你想要的格式。就是这样。
areswang 2007-11-30
  • 打赏
  • 举报
回复
不插入数据怎么能生成0005,当你再插入一条时就生成了。
火星求索 2007-11-30
  • 打赏
  • 举报
回复

使用自增就应该可以了

你若想生成A+0000的形式
也可新加一列,并自动编码,

--drop table tes
--go
--建表
create table tes (coding varchar(20) not null,a int)
go
--新建个函数
--drop function [dbo].[AutoGetCoding]
create function [dbo].[AutoGetCoding](@date datetime)
returns varchar(5)
as
begin
declare @str varchar(5)
select @str=isnull(max(coding),'A0000')
from tes
select @str=left(@str,1)+right('0000'+convert(varchar(4),convert(int,right(@str,4))+1),4)
return (@str)
end
--把表的默认值设置成[dbo].[AutoFollowExamCode](getdate())
--测试
go
--加约束
ALTER TABLE dbo.tes ADD CONSTRAINT
DF_t_coding DEFAULT [dbo].[AutoGetCoding](getdate()) FOR coding
--删除测试数据
go
--
declare @i int
select @i=8
while @i>0
begin
insert into tes(a) values ('1')
select @i=@i-1
end
--显示结果
go
select * from tes
/*coding a
-------------------- -----------
A0001 1
A0002 1
A0003 1
A0004 1
A0005 1
A0006 1
A0007 1
A0008 1
*/

qicaihuochai 2007-11-30
  • 打赏
  • 举报
回复
楼上的兄弟,你的方法好像不能让0005自动生成编号!!

不过还是感谢你的支持!!

谢谢!!
hui_hui_2007 2007-11-30
  • 打赏
  • 举报
回复
看下面方法行不行,用到计算列实现

CREATE TABLE [dbo].[tb1] (
[autoid] [int] IDENTITY (1, 1) NOT NULL ,
[myid] AS (right(str((10000 + [autoid])),4)) ,
[mytext] [char] (10)
)


insert into tb1 (mytext) values('qqqq')
insert into tb1 (mytext) values('bbbbb')
insert into tb1 (mytext) values('fffff')
insert into tb1 (mytext) values('tttt')

select * from tb1

/*
autoid myid mytext
----------- -------- ----------
1 0001 qqqq
2 0002 bbbbb
3 0003 fffff
4 0004 tttt

(所影响的行数为 4 行)
*/
leo_lesley 2007-11-30
  • 打赏
  • 举报
回复
你的方法能够编号到A100吗? 这个是什么意思没明白



你的表是怎么建的,只要主键是自增列,在读取的时候select 自动编号='A'+right('000'+rtrim(自增列),3) from 表名 这样就可以了
hui_hui_2007 2007-11-30
  • 打赏
  • 举报
回复
用计算列实现吧。就是多出一个列来。
qicaihuochai 2007-11-30
  • 打赏
  • 举报
回复
leo_lesley

你的方法能够编号到A100吗?

如果可以那我就试试!!

代码怎么添加,添加在哪里啊??

我的数据库不是用程序代码写的是从企业管理器中建立的,只设置了主键,别的没有动!!现在怎么才能修改啊?谢谢!!
you_tube 2007-11-30
  • 打赏
  • 举报
回复
LZ要求是自动生成的吧?

qicaihuochai 2007-11-30
  • 打赏
  • 举报
回复
我的数据库不是用程序代码写的是从企业管理器中建立的,只设置了主键,别的没有动!!现在怎么才能修改啊?谢谢!!
leo_lesley 2007-11-30
  • 打赏
  • 举报
回复
----例子

select 自动编号='A'+right('000'+rtrim(1),3)

/* 结果

自动编号
-------
A001

*/
leo_lesley 2007-11-30
  • 打赏
  • 举报
回复
如果你想要 A001 这种形式,也可以在读取的时候做啊, select 'A'+right('000'+id,3) -- 这里的id是自增列


别外你的数据库已经建好了,你是怎么建的?
you_tube 2007-11-30
  • 打赏
  • 举报
回复
这样不行
自动编号,只能是int数据类型

当 titles 表更改时,下例将电子邮件发送给指定的人员 (MaryM)。

USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'reminder' AND type = 'TR')
DROP TRIGGER reminder
GO
CREATE TRIGGER reminder
ON titles
FOR INSERT, UPDATE, DELETE
AS
EXEC master..xp_sendmail 'MaryM',
'Don''t forget to print a report for the distributors.'
GO

qicaihuochai 2007-11-30
  • 打赏
  • 举报
回复
我是这个意思:自动编号前面是0,后面的数字是自动编号,另外举个例子就是 :A001,下一个编号就是:A002,第一百个编号就是:A100

我的数据库已经建好了,怎么再使用触发器啊?触发器代码怎么写?麻烦详细告知,我是初学者。谢谢!!
leo_lesley 2007-11-30
  • 打赏
  • 举报
回复
也可以把自增列的起始值设为 10000 ,然后在读取的时候 left(id,4) 这样也可以, 对于你说的那个记录编号从0001到1000,删除0050,其他的号码不会改变,这个是什么意思没有明白
-狙击手- 2007-11-30
  • 打赏
  • 举报
回复
第二种方法:

ID 为 char(4)

在表上装触发器 AFTER或INSTEAD OF都行


加载更多回复(5)

34,838

社区成员

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

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