求教mysql触发器生成流水号

「已注销」 2015-07-25 05:03:26
利用mysql触发器可以生成如日期(20100721)+编号(0001)的流水号,编号每天都会从0001开始计算

create table orders(orders_id int(10) primary key,customer_name varchar(100) );
----------------------------------------------------------------------------------------------------------

CREATE TRIGGER tr_orders_id BEFORE INSERT ON orders
FOR EACH ROW BEGIN
declare n int;
select IFNULL(max(right(orders_id,4)),0) into n from orderswhere mid(orders_id,1,8)=DATE_FORMAT(CURDATE(),'%Y%m%d');
set NEW.orders_id=concat(DATE_FORMAT(CURDATE(),'%Y%m%d'),right(10001+n,4));
END;

----------------------------------------------------------------------------
insert into orders_id(customer_name) value('jack');
insert into orders_id(customer_name) value('jason');
-----------------------------------------------------------------------------

orders_id customer_name
201007210001 jack
201007210002 jason

我做项目练习,同样要做这样的流水号8位日期+4位顺序号。找了个教程,但是这个教程有问题
1. 触发器里的代码有问题,不能运行,求正确的范例,求表结构和触发器的代码演示

2.他的建表字段为orders_id int(10),但主键要插入12位数字,我在navcat里改变长度也只能插入10位数字,那应该用varchar吗?





...全文
648 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
风从北来 2016-09-20
  • 打赏
  • 举报
回复
set n=1; 是不是要写成:set n=n+1;
风从北来 2016-09-20
  • 打赏
  • 举报
回复
引用 9 楼 roy_88 的回复:
别在其它网友贴上提问,这是基础礼貌 有问题另开贴提问
好的,我看这个帖子和我的需求相似就回复了一下,谢谢指点。刚开始学习,实在有点不熟练
风从北来 2016-09-20
  • 打赏
  • 举报
回复
版主的办法可行,感谢
中国风 2016-09-20
  • 打赏
  • 举报
回复
别在其它网友贴上提问,这是基础礼貌 有问题另开贴提问
风从北来 2016-09-20
  • 打赏
  • 举报
回复
风从北来 2016-09-20
  • 打赏
  • 举报
回复
风从北来 2016-09-20
  • 打赏
  • 举报
回复
CREATE TRIGGER `tr_orders_id` BEFORE INSERT ON `orders` FOR EACH ROW BEGIN declare n int; select IFNULL(max(right(orders_id,4)),0) into n from orderswhere mid(orders_id,1,8)=DATE_FORMAT(CURDATE(),'%Y%m%d'); set NEW.orders_id=concat(DATE_FORMAT(CURDATE(),'%Y%m%d'),right(10001+n,4)); END; 我用navicat生成的代码,无法保存。
中国风 2016-09-20
  • 打赏
  • 举报
回复
最好的方法是用一个表记录,效率高,记数器 e.g.
drop table if exists orders,NextSerialNr;
create table orders(orders_id varchar(12) primary key,customer_name varchar(100) );
create table NextSerialNr(DT date,NextNr int);

delimiter $$
CREATE TRIGGER tr_orders_id BEFORE INSERT ON orders
FOR EACH ROW 
BEGIN
declare n int;
select NextNr into n from NextSerialNr where DT=DATE_FORMAT(CURDATE(),'%Y%m%d');
if n is null then 
	begin
		insert into NextSerialNr values(CURDATE(),2);
        set n=1;
    end;
end if;
set NEW.orders_id=concat(DATE_FORMAT(CURDATE(),'%Y%m%d'),right(10000+n,4));
END;
$$
delimiter ;
insert into orders(customer_name) value('jack');
insert into orders(customer_name) value('jason');

select * from orders;
中国风 2016-09-20
  • 打赏
  • 举报
回复
引用 3 楼 kkcls 的回复:
能把代码贴出来么,我测试都是失败。不让保存。 declare n int;报错
楼主的语句有3个错误 order_id--类型 orderswhere-连起来了 insert into order_id--这里是表名不是列
风从北来 2016-09-20
  • 打赏
  • 举报
回复
能把代码贴出来么,我测试都是失败。不让保存。 declare n int;报错
「已注销」 2015-07-25
  • 打赏
  • 举报
回复
引用 1 楼 yangb0803 的回复:
主键要插入12位数字, 肯定得用varchar 类型的字段了。 delimiter && CREATE TRIGGER tr_orders_id BEFORE INSERT ON orders FOR EACH ROW BEGIN declare n int; select IFNULL(max(right(orders_id,4)),0) into n from orderswhere mid(orders_id,1,8)=DATE_FORMAT(CURDATE(),'%Y%m%d'); set NEW.orders_id=concat(DATE_FORMAT(CURDATE(),'%Y%m%d'),right(10001+n,4)); END&&
谢谢二楼,我解决了, 1.是varchar类型 2.是 orders where 要分开 3.是主键orders_id要设一个默认值才能插进去,我设空字符串 还有就是注意写触发器,要改边界符delimiter// 中间是触发器代码的方式 //
道玄希言 2015-07-25
  • 打赏
  • 举报
回复
主键要插入12位数字, 肯定得用varchar 类型的字段了。 delimiter && CREATE TRIGGER tr_orders_id BEFORE INSERT ON orders FOR EACH ROW BEGIN declare n int; select IFNULL(max(right(orders_id,4)),0) into n from orderswhere mid(orders_id,1,8)=DATE_FORMAT(CURDATE(),'%Y%m%d'); set NEW.orders_id=concat(DATE_FORMAT(CURDATE(),'%Y%m%d'),right(10001+n,4)); END&&

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧