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