MySQL 根據觸發器編寫自定義流水號

剛纔在琢磨要按天生成序列號,一番查證後,變有了此文!

1.首先我們創建一張訂單表

sn_day,記錄按天生成的序列號; sn_hours,記錄按小時生成的序列號; sn_minutes 表示按分生成的序列號;

當然,你可以按自己的需要去定義這個字段名.

CREATE TABLE orders (
	sn_day DECIMAL (32) PRIMARY KEY,
	sn_hours DECIMAL (32),
	sn_minutes DECIMAL (32),
	remark VARCHAR (100)
);

2.我們在這訂單表新增數據時,自動生成序列號.而不是我們主動去插入這個序列號.那麼就需要用到觸發器.顧名思義,觸發嘛.

那就是,在訂單表,新增數據裏觸發了自動生成序列號.

CREATE TRIGGER sn_by_day BEFORE INSERT ON orders FOR EACH ROW
BEGIN
	DECLARE
		n INT;

SELECT
	IFNULL(max(RIGHT(sn_day, 10)), 0) INTO n
FROM
	orders
WHERE
	mid(sn_day, 1, 8) = DATE_FORMAT(NOW(), '%Y%m%d');

SET NEW.sn_day = concat(
	DATE_FORMAT(NOW(), '%Y%m%d'),
	RIGHT (10000000001 + n, 10)
);

END;

create trigger sn_by_day 創建一個觸發器,名稱叫 sn_by_day

before insert 在插入前

on orders 在訂單表上

總結下來就是,當訂單表插入數據前,得先觸發一個名叫 sn_by_day 的事件.

事件的流程:

1.先定義一個變量,叫n
2.在訂單表中查詢 sn_day 字段值的1-8位等於當前日期的數據
3.在這個數據中,取後10位最大的,如果沒有,則爲0
4.將這個查詢出來的值賦給變量n
5.將變量n加上10000000001,當然,要加上多少,你可以自己定.主要是爲了蹭長度
6.在當前日期將這個值呢拼接上,然後就生成了一個以當前日期開頭的增長序列值
7.將這個增長序列值存到 sn_day 字段中.

#強勢插入一條數據,看能不能自動生成序列號
INSERT orders (remark) VALUES (CONCAT('demo',DATE_FORMAT(NOW(),'%Y-%m-%d %h:%i:%s')));

額,沒忍住,多插了幾下,不過,好在有結果了! 有紅框中,新的一分鐘裏,重新生成了序列


好啦,按日生成序列號的需求完事了.我們就按這個套路來,順手把按時,按分生成序列號的也給做了吧!

CREATE TRIGGER sn_by_hours BEFORE INSERT ON orders FOR EACH ROW
BEGIN
	DECLARE
		n INT;

SELECT
	IFNULL(max(RIGHT(sn_hours, 8)), 0) INTO n
FROM
	orders
WHERE
	mid(sn_hours, 1, 10) = FROM_UNIXTIME(
		UNIX_TIMESTAMP(NOW(6)),
		'%Y%m%d%h'
	);

SET NEW.sn_hours = concat(
	FROM_UNIXTIME(
		UNIX_TIMESTAMP(NOW(6)),
		'%Y%m%d%h'
	),
	RIGHT (100000001 + n, 8)
);

END;

按分

CREATE TRIGGER sn_by_minutes BEFORE INSERT ON orders FOR EACH ROW
BEGIN
	DECLARE
		n INT;

SELECT
	IFNULL(max(RIGHT(sn_minutes, 6)), 0) INTO n
FROM
	orders
WHERE
	mid(sn_minutes, 1, 12) = FROM_UNIXTIME(
		UNIX_TIMESTAMP(NOW(6)),
		'%Y%m%d%h%i'
	);

SET NEW.sn_minutes = concat(
	FROM_UNIXTIME(
		UNIX_TIMESTAMP(NOW(6)),
		'%Y%m%d%h%i'
	),
	RIGHT (1000001 + n, 6)
);

END;

 

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