mysq触发器中的自增id问题

lihuan2008a 2013-07-08 05:06:33

CREATE TABLE `test` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`order` varchar(255) DEFAULT NULL,
`des` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

create trigger trigger_test before insert on test
for each row
begin
set new.order =concat('Ord',lpad(cast(new.id as char),5,'0'));
end;不行啊,得到的是00000

想要如下效果
id order des
1 00001
2 00002
咋么才能做到啊
...全文
400 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
WWWWA 2013-07-09
  • 打赏
  • 举报
回复
有并发时,建议先锁表,进行完后再释放锁
lihuan2008a 2013-07-09
  • 打赏
  • 举报
回复
引用 6 楼 dong_y888 的回复:

create trigger trigger_test before insert on test
for each row
begin
	declare n int;
	select max(id) into n from test;
	if n is null  then
		set n=1;
	else
		set n=n+1;
	end if;
	case  
		when n<10 && n>=0 then 
			set new.order=concat('ord','0000',cast(n as char));
		when n<100 && n>=10 then
			set new.order=concat('ord','000',cast(n as char));
		when n<1000 && n>=100 then
			set new.order=concat('ord','00',cast(n as char));
		when n<10000 && n>=1000 then
			set new.order=concat('ord','0',cast(n as char));	
		else
			set new.order=concat('ord',cast(n as char));
	end case;
end //
引用 7 楼 WWWWA 的回复:
DROP TRIGGER IF EXISTS trigger_test; DELIMITER $$ CREATE TRIGGER trigger_test BEFORE INSERT ON testa FOR EACH ROW BEGIN SET new.order =CONCAT('Ord',RIGHT(CONCAT('0000',LAST_INSERT_ID()+1),5)); END$$ DELIMITER ;
这两个在一个人执行的时候没问题,但若有多个人操作时,发生并发时会不会不准确
WWWWA 2013-07-09
  • 打赏
  • 举报
回复
DROP TRIGGER IF EXISTS trigger_test; DELIMITER $$ CREATE TRIGGER trigger_test BEFORE INSERT ON testa FOR EACH ROW BEGIN SET new.order =CONCAT('Ord',RIGHT(CONCAT('0000',LAST_INSERT_ID()+1),5)); END$$ DELIMITER ;
dong_y888 2013-07-08
  • 打赏
  • 举报
回复

create trigger trigger_test before insert on test
for each row
begin
	declare n int;
	select max(id) into n from test;
	if n is null  then
		set n=1;
	else
		set n=n+1;
	end if;
	case  
		when n<10 && n>=0 then 
			set new.order=concat('ord','0000',cast(n as char));
		when n<100 && n>=10 then
			set new.order=concat('ord','000',cast(n as char));
		when n<1000 && n>=100 then
			set new.order=concat('ord','00',cast(n as char));
		when n<10000 && n>=1000 then
			set new.order=concat('ord','0',cast(n as char));	
		else
			set new.order=concat('ord',cast(n as char));
	end case;
end //
ACMAIN_CHM 2013-07-08
  • 打赏
  • 举报
回复
MYSQL中没办法。 在BEFORE INSERT中无法得到ID的值。 而在AFTER INSERT中又无法更改记录。
lihuan2008a 2013-07-08
  • 打赏
  • 举报
回复
引用 3 楼 wwwwb 的回复:
set new.order =concat('Ord',right(concat('0000',new.id),5))

create trigger trigger_test before insert on test
for each row
begin
set new.order =concat('Ord',right(concat('0000',new.id),5));
end;

insert into test(des) values('中国'); 
select * from test;
这样也不行哦,和原来一样的仍是ord00000 只有在insert into test(id) values(6); 这样才可以 而这样的insert into test(des) values('中国'); new.id好像就取不到id
wwwwb 2013-07-08
  • 打赏
  • 举报
回复
set new.order =concat('Ord',right(concat('0000',new.id),5))
lihuan2008a 2013-07-08
  • 打赏
  • 举报
回复
zerofill这只是在id前填充0,
我需要的是order后面的数要和id保持一致


insert into test(des) values('中国');
select * from test;



wwwwb 2013-07-08
  • 打赏
  • 举报
回复
`id` bigint(20) zerofill NOT NULL AUTO_INCREMENT 试试

56,912

社区成员

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

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