2011-09-28 79 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;