Mysql 使用sql自动生成自定义id

Mysql 使用sql自动生成自定义id,mysql,auto-generate,Mysql,Auto Generate,我对sql和数据库比较陌生,希望在以下主题中得到一些帮助。 我有下表:(初级男性->jm,初级女性->jf,成年男性->am,成年女性->af) 并希望在表内创建一个字段作为引用,该字段由代码和自动递增数字组成,如下所示: id code name reference 1 jm john jm001 2 am patrick am001 3 af jane af001 4

我对sql和数据库比较陌生,希望在以下主题中得到一些帮助。 我有下表:(初级男性->jm,初级女性->jf,成年男性->am,成年女性->af)

并希望在表内创建一个字段作为引用,该字段由代码和自动递增数字组成,如下所示:

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
有谁能给我一些如何做的建议吗?谢谢你

首先,问问自己“为什么?”就像马丁的评论一样。如果你对这个问题有一个很好的答案,那么每种类型的序列可能就是你想要的。例如,在Oracle中:

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

此外,这不会像示例中那样为您提供前导零,因此如果需要,请查看数字的格式

您可以使用下面的代码来获得所需的结果。。。干杯

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:=@jm+1, @index:=@jm;
elseif code_new='am' then set @am:=@am+1, @index:=@am;
elseif code_new='af' then set @af:=@af+1, @index:=@af;
elseif code_new='jf' then set @jf:=@jf+1, @index:=@jf;
else set @unknown:=@unknown+1, @index:=@unknown;
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;

为什么?当需要时,您始终可以从
id
code
列计算此
参考
?对于
id
您需要一个
identity
auto increment
列(术语不同),您可以使用Computed列,因此我们可能知道您使用的是DBMSusing@MartinSmith我需要将它作为一个值存储在数据库中,这样它将是一个可搜索的字段,而不是在需要时计算它。你有什么建议?@rbc089-你仍然不知道,因为你的应用程序可以去掉前2个字符作为代码,剩下的作为
id
,并在搜索中使用它们作为单独的参数。但是我不知道您正在构建什么类型的应用程序,您正在使用什么RDBMS,因此无法提供任何具体的建议。@MartinSMith,但这样您就无法获得示例中的jm002,而是可以获得jm004。我将mySQL用作RDBMS。这是否也适用于mySQL?@rbc089:是的,但您必须更改序列创建、序列使用和字符串连接的语法。@Briguy37否。MySQL没有序列。MySQL使用了一个稍微不同的概念来自动生成id。@rbc089:很抱歉在MySQL中误导了您。看起来你可以,但我看到你已经有了另一个解决方案。
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:=@jm+1, @index:=@jm;
elseif code_new='am' then set @am:=@am+1, @index:=@am;
elseif code_new='af' then set @af:=@af+1, @index:=@af;
elseif code_new='jf' then set @jf:=@jf+1, @index:=@jf;
else set @unknown:=@unknown+1, @index:=@unknown;
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;