数据库表的某列的自定义自增函数(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、虽然该字段设置了唯一值约束,尽量别用它单做主键 。

 

 

你可能感兴趣的:(数据库)