数据库表的某列的自定义自增函数(mysql)

1、在该列上创建唯一值约束

-- 表名 约束名 列名,都不带引号
alter table 表名 add constraint 约束名 unique (列名)

2、根据字段值要求(比如 年份后两位+两位月份+两位天+当天的第几条记录(5位数,不足在左侧补零)),写一个自增函数。

-- dbname01 数据库名
-- generateCode 函数名
-- testtb01 表名
-- bizcode 列名
DELIMITER $$
USE `dbname01`$$
DROP FUNCTION IF EXISTS `generateCode`$$
CREATE DEFINER=`root`@`localhost` FUNCTION `generateCode`() RETURNS VARCHAR(50) CHARSET utf8
BEGIN
     DECLARE str VARCHAR(50) DEFAULT '';
     SET str=(SELECT CONCAT(SUBSTRING(DATE_FORMAT(NOW(),'%Y%m%d'),3),LPAD(CAST(SUBSTRING((SELECT MAX(bizcode) FROM testtb01),7) AS SIGNED)+1,4,0)));
     RETURN str;
    END$$
DELIMITER ;
-- 记录下用到的函数
-- SUBSTRING  字符串截取函数
-- DATE_FORMAT  日期格式化
-- CAST  类型转化
-- LPAD “数值位数不足补零”
-- CONCAT  字符串拼接

3、创建触发器,在每次新增一条记录前,设置该字段的值来自自定义函数的值

CREATE TRIGGER before_insert_testtb01
  BEFORE INSERT ON testtb01
  FOR EACH ROW
  SET new.bizcode = generateCode();

4、在插入数据时,不必设置该字段的值。大体思路就是这样,函数里只是一个简单的思路,考虑的并不全(没取当天的最大记录数。没加判断当天是否存在记录,不存在时,最大值就是0。只能插入一条记录,多条记录时触发器会设置这几条的字段值一样(违反唯一性约束))

5、虽然该字段设置了唯一值约束,尽量别用它单做主键 。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值