翻译整理:IT者 : 作者:qicaihuochai
<script type="text/javascript"> </script> <script src="file:///E:/%E6%88%91%E7%9A%84%E6%96%87%E6%A1%A3/%E7%9F%A5%E8%AF%86%E4%B9%8B%E5%AE%B6/%E5%A6%82%E4%BD%95%E8%AE%BE%E7%BD%AE%E8%87%AA%E5%8A%A8%E7%BC%96%E5%8F%B7%E7%9A%84%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BA%E7%9A%84%E9%97%AE%E9%A2%98%EF%BC%9F%EF%BC%9F%20-%20IT%E8%80%85_files/show_ads.js" type="text/javascript"> </script>
我的数据库是SQL2000,我想将一个字段设置成自动编号,并且自动编号的格式为:0001.即第一条记录的编号是:0001,那么自动编号的下一条记录的编号就是:0002.
并且假如在中间删除一条数据记录不影响其他编号的变化。即,记录编号从0001到1000,删除0050,其他的号码不会改变。
这个问题我曾经问过很多人都没有回答,希望各位专家,老手给与解答!!
谢谢!!
网友回复:create table ddd(id int identity(1,1)......
这样就行
网友回复:然后用于显示时再进行转换
select right('000000' ltrim(id),4)
网友回复:为什么要在数据库中设置呢,在读取的时候设置不可以吗?
---例子
id 是自增列
select right('0000' id,4) 这种形式不可以吗?
网友回复:第二种方法:
ID 为 char(4)
在表上装触发器 AFTER或INSTEAD OF都行
网友回复:也可以把自增列的起始值设为 10000 ,然后在读取的时候 left(id,4) 这样也可以, 对于你说的那个记录编号从0001到1000,删除0050,其他的号码不会改变,这个是什么意思没有明白
网友回复:我是这个意思:自动编号前面是0,后面的数字是自动编号,另外举个例子就是 :A001,下一个编号就是:A002,第一百个编号就是:A100
我的数据库已经建好了,怎么再使用触发器啊?触发器代码怎么写?麻烦具体告知,我是初学者。谢谢!!
网友回复:这样不行
自动编号,只能是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
网友回复:假如你想要 A001 这种形式,也可以在读取的时候做啊, select 'A' right('000' id,3) -- 这里的id是自增列
别外你的数据库已经建好了,你是怎么建的?
网友回复:----例子
select 自动编号='A' right('000' rtrim(1),3)
/* 结果
自动编号
-------
A001
*/
网友回复:我的数据库不是用程序代码写的是从企业治理器中建立的,只设置了主键,别的没有动!!现在怎么才能修改啊?谢谢!!
网友回复:LZ要求是自动生成的吧?
网友回复:leo_lesley
你的方法能够编号到A100吗?
假如可以那我就试试!!
代码怎么添加,添加在哪里啊??
我的数据库不是用程序代码写的是从企业治理器中建立的,只设置了主键,别的没有动!!现在怎么才能修改啊?谢谢!!
网友回复:用计算列实现吧。就是多出一个列来。
网友回复:你的方法能够编号到A100吗? 这个是什么意思没明白
你的表是怎么建的,只要主键是自增列,在读取的时候select 自动编号='A' right('000' rtrim(自增列),3) from 表名 这样就可以了
网友回复:看下面方法行不行,用到计算列实现
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
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 行)
*/
网友回复:楼上的兄弟,你的方法似乎不能让0005自动生成编号!!
不过还是感谢你的支持!!
谢谢!!
网友回复:
使用自增就应该可以了
你若想生成A 0000的形式
也可新加一列,并自动编码,
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--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
*/