2011-09-28 78 views
0

我是相对较新的SQL和数据库,并希望在以下主题的一些帮助。 我有如下表:(初中男生 - > JM,大三女生 - > JF,成年男性 - >上午,成年雌性 - > AF)自动生成与SQL的自定义ID

id code  name  
1  jm  john  
2  am  patrick  
3  af  jane  
4  jm  peter  
5  jm  derrick  
6  af  mary  
7  jf  jessica 

,并想创建表作为内场它以这种方式组成的代码,并自动递增的数字的引用:

id  code  name  reference 

1  jm  john  jm001 

2  am  patrick am001 

3  af  jane  af001 

4  jm  peter  jm002 

5  jm  derrick jm003 

6  af  mary  af002 

7  jf  jessica jf001 

谁能给我如何做到这一点有什么秘诀?谢谢

+5

为什么?您可以随时在“id”和“code”列中根据需要计算此“引用”?对于'id',你需要一个'identity'或'auto increment'列(术语各不相同) –

+0

你可以使用Computed列,因为我们可能知道你正在使用的DBMS –

+0

@MartinSmith我需要将它存储为一个值在数据库内部,这样它将成为一个可搜索的字段,而不是在我需要它时计算它。你有什么建议? – rbc089

回答

1

首先,问自己“为什么?”正如马丁的评论。如果你对这个问题有一个很好的答案,那么每种类型的序列可能就是你正在寻找的。例如,在甲骨文:

CREATE SEQUENCE jm_seq START WITH 1 INCREMENT BY 1 NOMAXVALUE NOCYCLE; 
CREATE SEQUENCE jf_seq START WITH 1 INCREMENT BY 1 NOMAXVALUE NOCYCLE; 
CREATE SEQUENCE am_seq START WITH 1 INCREMENT BY 1 NOMAXVALUE NOCYCLE; 
CREATE SEQUENCE af_seq START WITH 1 INCREMENT BY 1 NOMAXVALUE NOCYCLE; 

然后,您可以在进入特定类型的使用这些。例如,进入初中男,你会使用:

Insert into table_name 
    values (id_seq.nextVal, 'jm', 'Bart', 'jm' || jm_seq.nextVal); 

此外,这不会给你前导零在你的榜样,所以考虑如果需要格式化你的电话号码。

+0

这是否也适用于MySQL? – rbc089

+0

@ rbc089:是的,尽管您必须更改序列创建,序列使用和字符串连接的语法。 – Briguy37

+0

@ Briguy37没有。 MySQL没有序列。 MySQL使用一个不同的概念来生成自动ID。 – Karolis

0

你可以利用有序此下面的代码就可以抵达你想要的结果...干杯......

drop table if exists Custom_id_Dynamic; 
create table Custom_id_Dynamic (id int primary key auto_increment , Code varchar(20), 
Name varchar(20), Reference varchar(20)); 


drop procedure if exists Dynamic_id; 

set @index:=0; 
set @jm:=0; 
set @unknown:=0; 
set @am:=0; 
set @af:=0; 
set @jf:=0; 

delimiter $$ 

create procedure Dynamic_id(
in code_new varchar(20), in name_new varchar(20) 
) 

begin 
set code_new=lower(code_new); 
if code_new='jm' then set @jm:[email protected]+1, @index:[email protected]; 
elseif code_new='am' then set @am:[email protected]+1, @index:[email protected]; 
elseif code_new='af' then set @af:[email protected]+1, @index:[email protected]; 
elseif code_new='jf' then set @jf:[email protected]+1, @index:[email protected]; 
else set @unknown:[email protected]+1, @index:[email protected]; 
end if; 
insert into Custom_id_Dynamic (Code, Name, Reference) 
values (code_new, name_new, concat(code_new, lpad(@index,3,0))); 
end; 



call Dynamic_id('jm','john'); 
call Dynamic_id('am','patrick'); 
call Dynamic_id('af','jane'); 
call Dynamic_id('jm','peter'); 
call Dynamic_id('jm','derrick'); 
call Dynamic_id('af','mary'); 
call Dynamic_id('jf','jessica'); 


select * from Custom_id_Dynamic;