數據庫表的某列的自定義自增函數(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、雖然該字段設置了唯一值約束,儘量別用它單做主鍵 。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章