我有下表:
create table test
(
ID int not null AUTO_INCREMENT,
CreatedOn datetime not null DEFAULT CURRENT_TIMESTAMP,
OrderNo varchar(100) not null,
Primary Key (ID)
);
我想知道我是否可以订购这样的订单:DNB1605141
但是有一个条件,在每个月的开始,序列号应该重新设置为1。
例如:DNB1605011(2016年5月1日第1个订单),DNB1606011(2016年6月1日第1个订单)
我正在编写一个存储过程来将值插入表中。但我不知道如何生成订单号。
请指教。感谢
答案 0 :(得分:0)
我没有通过Scheduler事件创建和监视,而是想通过日期函数来检查这个。在创建订单时插入之前没有它会检查DAYOFMONTH是否为1,如果是,那么它会将订单号重新设置为1,否则它将获取最大订单号。我将订单号存储在单独的列中,而前缀存储在单独的列中。
对于DNB1605141:A列中的DNB1605和B列中的141
以下是订单生成代码:
DELIMITER $$
DROP PROCEDURE IF EXISTS spCashDonation$$
CREATE PROCEDURE spCashDonation(IN fname varchar(50),IN lname varchar(50),IN telNo bigint, IN pmode tinyint,IN amt decimal(13,2), OUT rno varchar(20))
BEGIN
Set @rmain := (select trim(concat('DNB', DATE_FORMAT(CURRENT_DATE(), '%y'), DATE_FORMAT(CURRENT_DATE(), '%m'))));
IF ((trim(DATE_FORMAT(CURRENT_DATE(),'%m')) = 01) OR (trim(DATE_FORMAT(CURRENT_DATE(),'%m')) = 1)) THEN
Set @rpart = 1;
END IF;
IF ((trim(DATE_FORMAT(CURRENT_DATE(),'%m')) != 01) OR (trim(DATE_FORMAT(CURRENT_DATE(),'%m')) != 1)) THEN
Set @rpart := (select coalesce(max(ReceiptPart),0) from Donation) + 1;
END IF;
INSERT INTO Donation (ReceiptMain, ReceiptPart, firstName, lastName, telNo, payMode, Amount) VALUES (@rmain, @rpart, fname, lname, telNo, pmode, amt);
Set @lid := (select max(LAST_INSERT_ID()));
select concat(ReceiptMain,ReceiptPart) into rno from donation where id = @lid;
END$$
DELIMITER ;
答案 1 :(得分:-1)
您可以按如下方式计算下一个OrderNo:
select count(1) + 1 as NextOrderNo
FROM test
where date_format(CreatedOn, '%Y') = date_format(current_date(), '%Y')
and date_format(CreatedOn, '%m') = date_format(current_date(), '%m');
可能将其用于插入语句的子选择。
您应该考虑多线程环境的影响, 在同一个月内可能存在重复的OrderNo值 如果多个线程同时插入。