【问题标题】:auto generate custom id with sql使用 sql 自动生成自定义 id
【发布时间】:2011-09-28 18:52:17
【问题描述】:

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

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

谁能给我一些关于如何做到这一点的提示?谢谢

【问题讨论】:

  • 为什么?您总是可以在需要时从idcode 列中计算出这个reference?对于id,您需要一个identityauto increment 列(术语不同)
  • 您可以使用计算列,为此我们可能知道您正在使用的 DBMS
  • @MartinSmith 我需要将它作为一个值存储在数据库中,以便它成为一个可搜索的字段,而不是在我需要时计算它。你有什么建议?
  • @rbc089 - 您仍然不需要,因为您的应用程序可以将前 2 个字符作为代码删除,将其余字符作为 id 并在搜索中将它们用作单独的参数。但是我不知道您正在构建什么类型的应用程序,您正在使用什么 RDBMS,因此无法提出任何具体建议。
  • @MartinSMith 但这样你就不能像例子中那样得到 jm002,而是你会得到 jm004。我使用 mySQL 作为 RDBMS。

标签: mysql auto-generate


【解决方案1】:

首先,问自己“为什么?”正如马丁的评论。如果您对这个问题有一个很好的答案,那么每种类型的序列可能就是您正在寻找的。例如在 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);

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

【讨论】:

  • 这也适用于mysql吗?
  • @rbc089:是的,尽管您必须更改用于序列创建、序列使用和字符串连接的语法。
  • @Briguy37 不。 MySQL 没有序列。 MySQL 对自动 id 生成使用了一些不同的概念。
  • @rbc089:很抱歉因为 MySQL 中的序列而误导您。看起来您确实可以emulate them,但我看到您已经有了替代解决方案。
【解决方案2】:

您可以使用以下代码来达到您想要的结果...干杯...

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 2021-02-22
    相关资源
    最近更新 更多