目录

使用function实现类似oracle里的sequence序列

1.登录mysql进入具体的数据库下

用工具登录,或者linux下脚本:mysql -u username -p

输入密码,再use database

2.创建function

DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `_nextval`(n varchar(50)) RETURNS int(11)
begin declare _cur int; 
set _cur=(select current_value from sequence where name= n); 
update sequence set current_value = _cur + increment_num where name=n; 
return _cur;
end
;;
DELIMITER ;

如果这时候报错

ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

,有可能是一个系统变量没有打开,执行以下命令,再重新创建function即可

show variables like 'log_bin_trust_function_creators';#OFF
set global log_bin_trust_function_creators=1;#修改mysql环境变量
show variables like 'log_bin_trust_function_creators';#ON

3.创建sequence表

CREATE TABLE `sequence` (
  `NAME` varchar(50) NOT NULL,
  `CURRENT_VALUE` int(10) unsigned NOT NULL,
  `INCREMENT_NUM` int(10) unsigned NOT NULL DEFAULT '1',
  PRIMARY KEY (`NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='序列表';

4.插入sequence数据

每条记录指向一张表的序列,name为表名

insert into sequence(name,current_value,increment_num)
values('be_acco_capital_mode',1,1);

5.查询序列(自增)

select * from sequence;#查看当前值,为1
select _nextval('be_acco_capital_mode') from dual;#查询表名对应的序列,_nextval的参数为对应的表名
select * from sequence;#查看下一个值,为2