创建表格时,根据2个自动编号和常数字母创建主键

时间:2019-10-14 10:51:28

标签: mysql

我是MYSQL的新手,我想创建一个表,其中将描述部门的常量Letter添加到自动递增编号中。这样,我将能够在查看ID时识别出工人的类别。 例如部门A和员工135。我正在成像的ID应该读为A135或类似内容。我已经创建了表格,自动递增工作正常,常量字母已经声明并且具有特征。但是,我想将它们连接起来以便使用A135作为主键。

请帮忙吗?

2 个答案:

答案 0 :(得分:0)

这非常棘手,您最好在选择查询中进行手动串联。

但是既然你要了...

通常情况下,您会为此使用计算列,但是它们不支持在声明中使用自动增量列。因此,您将需要使用触发器:

  • 插入时,查询information_schema.tables以检索将要分配的自动递增的ID,并使用它来生成自定义ID

  • 在更新时,重置自定义ID

请考虑以下表格结构:

create table workers (
    id int auto_increment primary key,
    name varchar(50) not null,
    dept varchar(1) not null,
    custom_id varchar(12) 
);

这是插入的触发器:

delimiter //
create trigger trg_workers_insert before insert ON workers
for each row
begin

    if new.custom_id is null then
        select auto_increment into @nextid 
        from information_schema.tables
        where table_name = 'workers' and table_schema = database();

        set new.custom_id = CONCAT(new.dept, lpad(@nextid, 11, 0));
    end if;
end
//
delimiter ;

以及更新触发器:

delimiter //    
create trigger trg_workers_update before update ON workers
for each row
begin
    if new.dept is not null then        
        set new.custom_id = CONCAT(new.dept, lpad(old.id, 11, 0));
    end if;
end
//                                            
delimiter ;

让我们运行一些插入代码进行测试:

insert into workers (dept, name) values ('A', 'John');
insert into workers (dept, name) values ('B', 'Jim');
select * from workers;

| id  | name | dept | custom_id    |
| --- | ---- | ---- | ------------ |
| 1   | John | A    | A00000000001 |
| 2   | Jim  | B    | B00000000002 |

让我们测试更新触发器

update workers set dept = 'C' where name = 'Jim';
select * from workers;

| id  | name | dept | custom_id    |
| --- | ---- | ---- | ------------ |
| 1   | John | A    | A00000000001 |
| 2   | Jim  | C    | C00000000002 |

Demo on DB Fiddle

答案 1 :(得分:0)

对不起,我的回答不适合评论。

我同意@GMB。 这是一个棘手的情况,在某些情况下(主要是选择)会导致性能风险,因为您必须在where语句中拆分PK,不建议这样做。 有一个部门列和一个auto_increment列更合乎逻辑。而且,您唯一的差距就是知道每个部门要按部门分组的员工人数。而不是用max()拆分级联的PK,这会降低性能。 让原子和逻辑数据保留在单独的列中。我建议用连接值创建第三列。 如果出于某种公司原因,您需要不同部门员工的B1和A1值,我建议您设置3列

Col1 - letter(not null)
Col2 - ID(Not auto-increment, but calculated as @GMB's solution) (Not NULL)
Col3 - Concatenation of Col1 and Col2 (not null)
PK( Col1, col2)