订单号---使用存储过程---查询一次. 就变化一次.保证不重复

//01 cmd下线导入存储过程,

DELIMITER $$

USE `tripb`$$

DROP PROCEDURE IF EXISTS `generate_orderNo`$$

-- 这个是授权用户名.在任何ip上?

CREATE DEFINER=`tripb`@`%` PROCEDURE `generate_orderNo`(IN orderNamePre CHAR(2), IN num INT, OUT newOrderNo VARCHAR(25))
BEGIN
DECLARE oldOrderNo VARCHAR (25) DEFAULT '' ;-- 离现在最近的满足条件的订单编号
DECLARE currentDate VARCHAR (15) ;-- 当前日期,有可能包含时分秒
DECLARE ordercurrentDate VARCHAR (15) ;-- 订单的当前日期,有可能包含时分秒
DECLARE orderNameValue INT; -- 订单变化的值
DECLARE orderNameNum INT DEFAULT 6; -- 订单变化的值

IF num = 8 THEN -- 根据年月日生成订单编号
SELECT DATE_FORMAT(NOW(), '%Y%m%d') INTO currentDate ;-- 订单编号形式:前缀+年月日+流水号,如:SH2013011000002
ELSEIF num = 14 THEN -- 根据年月日时分秒生成订单编号
SELECT DATE_FORMAT(NOW(), '%Y%m%d%H%i%s') INTO currentDate ; -- 订单编号形式:前缀+年月日时分秒+流水号,如:SH2013011010050700001,个人不推荐使用这种方法生成流水号
ELSE -- 根据年月日时分生成订单编号
SELECT DATE_FORMAT(NOW(), '%Y%m%d%H%i') INTO currentDate ;-- 订单形式:前缀+年月日时分+流水号,如:SH20130110100900005
END IF ;

-- 获得当前的订单和变化的值
SELECT IFNULL(orderno, ''),IFNULL(ordervalue+1,0),IFNULL(DATE_FORMAT(ordertime, '%Y%m%d'),'') INTO oldOrderNo,orderNameValue,ordercurrentDate
FROM generate_serialno
WHERE id=1 FOR UPDATE; -- 验证当天的时间

-- 如果存在在原来的基础上加1,不存在从1开始
IF oldOrderNo!=''&&ordercurrentDate=currentDate THEN -- 订单号不为空,并且 ,当前订单时间和当前时间相同,再原来基础上+1,否则新的一天从1开始
SELECT CONCAT(orderNamePre, currentDate,LPAD(orderNameValue, orderNameNum, '0')) INTO newOrderNo ;
ELSE
SELECT CONCAT(orderNamePre, currentDate,LPAD(1, orderNameNum, '0')),1 INTO newOrderNo,orderNameValue;
END IF;

SET autocommit=0;-- 禁止自动提交
-- 订单存在更改id为1的记录,不存在插入id为1的记录
IF oldOrderNo!='' THEN
UPDATE generate_serialno SET orderno=newOrderNo,orderpre=orderNamePre,ordertime=NOW(),ordervalue=orderNameValue WHERE id=1;
ELSE
INSERT INTO generate_serialno(id,orderno,orderpre,ordertime,ordervalue) VALUES(1,newOrderNo,orderNamePre,NOW(),1);
END IF;
COMMIT;-- 提交事务

SELECT
newOrderNo ;
END$$

DELIMITER ;

DROP TABLE IF EXISTS `generate_serialno`;

CREATE TABLE `generate_serialno` (
`id` int(20) DEFAULT NULL,
`orderno` varchar(50) DEFAULT NULL,
`orderpre` varchar(30) DEFAULT NULL,
`ordervalue` int(20) DEFAULT NULL,
`ordertime` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

//03 每执行一下,查询一次. 就变化一次.保证不重复
public function test(){

$sql = "CALL `generate_orderNo`('Y', 8, @orderNo)";  // Y20160906000003
$info = M()->query($sql);

echo '<meta http-equiv="Content-type" content="text/html:charset=utf-8">';
echo '<pre>';
var_dump($info);

}

原文地址:https://www.cnblogs.com/bj-tony/p/5846415.html