MySQL存储过程和代码分别生成订单号,MySQL拾遗
2016-03-29 12:54
567 查看
业务中我们的订单号有几位是一个序列,每天的第一笔订单序列为1,以后每增加一个订单序列+1。每天需要清零。如果是Oracle就可以直接使用Sequence实现。在MySQL中,我们在数据库中设计一个表
![](https://oscdn.geek-share.com/Uploads/Images/Content/201909/21/88cb20da27fbf7cc53cd95f615a776fa)
表中只有一条记录,通过update_day判断同一天每次sequence+1,第二天的话就更新update_day。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201909/21/a7359c5e470042ede319c82d8533e20e)
代码实现:
String getOrderSeq() {
//OrderSeq orderSeq = OrderSeq.dao.findById(1);//根据id获取这个记录
OrderSeq orderSeq = OrderSeq.dao.findByType(0);//缴费订单的type=0
long seq = 1;//每天的第一个订单从1开始
Date date = orderSeq.getDate("update_day");
if(DateKit.isToday(date)){//还在今天
seq = orderSeq.getLong("sequence");
orderSeq.set("sequence", seq+1).update();//今天的话就不用更新update_day字段
}else{
orderSeq.set("sequence", seq+1).set("update_day", new Date()).update();//今天的话就不用更新update_day字段
}
return H5ApiConstant.Order.JIAOFEE_FORMAT.format(seq);
}
DateKit类中
public static String toStr(Date date, String format) {
SimpleDateFormat sdf = null;
if(null!=format&&!"".equals(format)){
sdf = new SimpleDateFormat(format);
return sdf.format(date);
}else{
sdf = new SimpleDateFormat(DateKit.dateFormat);
return sdf.format(date);
}
}
private static Date TODAY = new Date();
public static boolean isToday(Date date){
if(toStr(date).equals(toStr(TODAY))){//如果还是今天
return true;
}else{
DateKit.TODAY = new Date();//比较的基础改为今天,因为new Date()表示当前时间
return false;
}
}
使用MySQL存储过程在调用的时候就简单一些了,自己维护sequence和update_day字段。
BEGIN
#Routine body goes here...
#根据类型生成一个订单序列
DECLARE id int;
declare updateDay date;
select o.`id`,o.`sequence`,o.`update_day` into id,orderSeq,updateDay from `order_seq` o where o.`type`=orderType;
if TO_DAYS(updateDay) = TO_DAYS(SYSDATE()) then
/* 用@符号加变量名的方式定义一个变量,与declare类似 */
update order_seq set sequence=sequence+1 where id=id;
else
set orderSeq = 1;
update order_seq set sequence=2,update_day=SYSDATE() where id=id;
end if;
END
![](https://oscdn.geek-share.com/Uploads/Images/Content/201909/21/9c5b086eae8f9b1206244314596cf1ab)
存储过程或者函数在copy的过程中,可能出现如下错误:
这是由于权限问题导致的:两种解决方案:
1.赋权限
grant all privileges on *.* to root@"%" identified by ".";
flush
privileges;
2.改变安全策略
![](https://oscdn.geek-share.com/Uploads/Images/Content/201909/21/fe39f34afcdfa1ad4b0efc23c24f8c96)
一些关于Mysql的操作
mysql修改密码
对于绿色版的mysql,虽然root用户是默认存在的,但是没有密码,可以通过以下方式修改
命令行下进入mysql的安装目录\bin,输入mysqladmin -u用户名 -p旧密码 password 新密码进行修改。
mysql之间的数据导入导出的时候注意版本之间的区别,5.6.12的数据导入5.5.36不能成功,但是导入5.6.17成功,也基本符合向前兼容性原则。
navicat连接mysql应该是通过网络的方式
访问其他电脑的共享文件使用\\IP地址,要求共享电脑和本电脑在同一个网段,并且有共享的东西。
表中只有一条记录,通过update_day判断同一天每次sequence+1,第二天的话就更新update_day。
代码实现:
String getOrderSeq() {
//OrderSeq orderSeq = OrderSeq.dao.findById(1);//根据id获取这个记录
OrderSeq orderSeq = OrderSeq.dao.findByType(0);//缴费订单的type=0
long seq = 1;//每天的第一个订单从1开始
Date date = orderSeq.getDate("update_day");
if(DateKit.isToday(date)){//还在今天
seq = orderSeq.getLong("sequence");
orderSeq.set("sequence", seq+1).update();//今天的话就不用更新update_day字段
}else{
orderSeq.set("sequence", seq+1).set("update_day", new Date()).update();//今天的话就不用更新update_day字段
}
return H5ApiConstant.Order.JIAOFEE_FORMAT.format(seq);
}
DateKit类中
public static String toStr(Date date, String format) {
SimpleDateFormat sdf = null;
if(null!=format&&!"".equals(format)){
sdf = new SimpleDateFormat(format);
return sdf.format(date);
}else{
sdf = new SimpleDateFormat(DateKit.dateFormat);
return sdf.format(date);
}
}
private static Date TODAY = new Date();
public static boolean isToday(Date date){
if(toStr(date).equals(toStr(TODAY))){//如果还是今天
return true;
}else{
DateKit.TODAY = new Date();//比较的基础改为今天,因为new Date()表示当前时间
return false;
}
}
使用MySQL存储过程在调用的时候就简单一些了,自己维护sequence和update_day字段。
BEGIN
#Routine body goes here...
#根据类型生成一个订单序列
DECLARE id int;
declare updateDay date;
select o.`id`,o.`sequence`,o.`update_day` into id,orderSeq,updateDay from `order_seq` o where o.`type`=orderType;
if TO_DAYS(updateDay) = TO_DAYS(SYSDATE()) then
/* 用@符号加变量名的方式定义一个变量,与declare类似 */
update order_seq set sequence=sequence+1 where id=id;
else
set orderSeq = 1;
update order_seq set sequence=2,update_day=SYSDATE() where id=id;
end if;
END
存储过程或者函数在copy的过程中,可能出现如下错误:
mysql 1449 : The user specified as a definer ('root'@'%') does not
exist
这是由于权限问题导致的:两种解决方案:1.赋权限
grant all privileges on *.* to root@"%" identified by ".";
flush
privileges;
2.改变安全策略
一些关于Mysql的操作
1)将MySQL 添加到服务中。 以管理员模式启动cmd,进入mysql安装路径: d:/appspace/mysql /bin> 输入 mysqld --install MySQL --defaults-file="C:\Windows\my.ini" 要指定defaults-file. 命令行中输入services.msc回车,可以看到MySQL已被添加到Services中, Path to executable中的内容为 d:\appspace\mysql\bin\mysqld --defaults-file=C:\windows\my.ini MySQL 2)启动MySQL 在MySQL Service中点击Start按钮,或者在命令行(Run as administrator)中输入 net start mysql. 如果出现1067错误,启动不了,则重新检查my.ini文件(前面有描述) 3)关闭MySQL 在MySQL Service中点击Stop按钮,或者在命令行(Run as administrator)中输入 net stop mysql. 4)删除mysql服务 mysqld –remove
mysql修改密码
对于绿色版的mysql,虽然root用户是默认存在的,但是没有密码,可以通过以下方式修改
命令行下进入mysql的安装目录\bin,输入mysqladmin -u用户名 -p旧密码 password 新密码进行修改。
mysql之间的数据导入导出的时候注意版本之间的区别,5.6.12的数据导入5.5.36不能成功,但是导入5.6.17成功,也基本符合向前兼容性原则。
navicat连接mysql应该是通过网络的方式
访问其他电脑的共享文件使用\\IP地址,要求共享电脑和本电脑在同一个网段,并且有共享的东西。
相关文章推荐
- 比较两个mysql数据库表结构的差异
- mysql join 查询图
- mysql连接数据库指令
- nagios 实现Mysql 主从同步状态的监控
- 关于sql和MySQL的语句执行顺序(必看!!!)
- NFS共享MySQL使用DNS轮询实现Web负载均衡 推荐
- mysqlbinlog: Character set '#45' is not a compiled character set and is not specified in the '/usr/s
- windows环境中mysql忘记root密码的解决办法
- MYSQL数据恢复--使用日志文件
- mysql 利用自增数据项的方法,对同一个表有某种关联的数据进行处理。(利用增加一项的方法)
- 改变MySQL 编码格式
- [失败]RHEL 6.4 64位上安装MySQL5.5.48出现的问题
- Mysql导入官方示例employees问题解决记录
- c#连接mysql答题步骤
- c#mysql数据库
- mysql 将null转代为0(以及一些特殊用法)
- MySQL权限篇之PROCESS
- MySql事务详解
- windows7下 安装 mysql-5.7.11-win32
- MySql学习笔记(2)-简介