MySlq 创建定长字符串主键,使用触发器

因为想让目录的主键整齐好用,所以使用定长的字符串做主键,在表为空和只有一个数据的时候LAST_INSERT_ID()方法获取的值都是1,所以在触发器里做了判断

drop table  if exists tb_cate;
create table tb_cate(
id char(5) primary key DEFAULT '' COMMENT '目录编号,5位数字,高位补0,从00001开始,每次递增1,由序列和触发器控制',
type char(1) default 0 COMMENT '目录类型,备用,可以设置共享目录等',
name varchar(40) not null COMMENT '目录名称',
`describe` varchar(200) COMMENT '目录描述',
code varchar(30) not null COMMENT '目录完整编码,例如0000100002,不包含自身',
parent char(5) COMMENT '上级目录',
lev char(1) default 0 COMMENT '目录等级,默认0级',
create_user int(10) default 0 COMMENT '目录创建人,默认0为系统创建',
update_user int(10) default 0 COMMENT '目录最后修改人,默认0为系统创建',
createtime datetime COMMENT '目录创建时间',
updatetiem datetime COMMENT '目录最后修改时间',
increc_id  int unique auto_increment COMMENT '只为实现触发器使用的字段,实体中不需要映射此字段'
);

delimiter // #必须有的
CREATE TRIGGER tb_cate_createid before insert ON tb_cate
FOR EACH ROW BEGIN
select count(increc_id) from tb_cate into @inid;#判断表是否为空
if @inid=0 then
set new.id = SUBSTRING(concat('00000',cast(LAST_INSERT_ID() as char)),(char_length(concat('00000',cast(LAST_INSERT_ID() as char)))-4));
else
set new.id = SUBSTRING(concat('00000',cast(LAST_INSERT_ID()+1 as char)),(char_length(concat('00000',cast(LAST_INSERT_ID()+1 as char)))-4));
end if;
END;
// delimiter ; #必须有的

 

#下面是第二种方法,第一种方法在Mysql Workbench中测试有问题,第二种方法没有问题,都还没有在java中测试


 delimiter // #必须有的

CREATE TRIGGER tb_cate_createId before insert ON tb_cate
FOR EACH ROW BEGIN

select count(increc_id) from tb_cate into @inid;
if @inid=0 then
set new.id = SUBSTRING(concat('00000',cast(1 as char)),(char_length(concat('00000000000000000000',cast(1 as char)))-4));
else
select max(increc_id) from tb_cate into @maxid;
set new.id = SUBSTRING(concat('00000',cast(@maxid+1 as char)),(char_length(concat('00000000000000000000',cast(@maxid+1 as char)))-4));
end if;
END;

// delimiter ; #必须有的


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值