mysql 自定义 sequence 存储过程

mysql本身是没有sequence的但是我可以自己建立sequence存储过程.

首先我们先建立相关的表,和存储过程.

第一步是创建规则表.

 

drop table if exists `seq`;
create table `seq` (
  `id` 	bigint(11)		not null 		auto_increment,
  `name` 	varchar(255) 	not null		comment 'sequence名称',
  `max` 	bigint(11)		not null default '1' 	comment '最大id', 
  `length`int(2) 		not null default '1' 	comment '生成序列后的长度,以0补全',
  `next` 	int(2) 		not null default '1' 	comment '增长的长度',
  `rules` 	varchar(255) 	default null 	comment '规则以###max_id###做为替换',
  primary key (`id`),
  unique key `fk_name` (`name`)
) engine=innodb auto_increment=1 default charset=utf8;

 

第二步是创建sequence方法.计算方法.

 

drop function if exists bj;
delimiter $
create function bj (seq_name varchar(50))
returns varchar(20)
contains sql
begin
	declare seq_rules varchar(255);
	declare seq_length int(2);
	declare seq_max bigint(20);

	declare max_id_length int(20);
	declare max_id varchar(20);

	select rules,seq.`length`,`max` into seq_rules, seq_length,seq_max from seq where name =  seq_name ;

	set max_id = seq_max;
	set max_id_length = character_length(max_id);

	#长度不够补0
	while seq_length > max_id_length do
		set max_id = concat('0',max_id);
		set max_id_length = character_length(max_id);
	end while; 

	#替换规则
	if seq_rules is not null and instr(seq_rules,'###max_id###') > 0   then
		set max_id = replace(seq_rules,'###max_id###',max_id);
	end if;

	return max_id;
end$
delimiter ;

 

第三步是创建sequence方法.调用方法.

 

 

drop function if exists nextval;
delimiter $
create function nextval (seq_name varchar(50))
returns varchar(20)
contains sql
begin
   update seq set `max` = `max` + next  where name = seq_name;
   return bj(seq_name);
end$
delimiter ;

 

 

好上边没问题了 我们建立几条测试数据看看。

 

#纯数字序列
insert into `seq` (`name`,`max`,`length`,`next`,`rules`) values ('seq_test1', '0', '1', '1', null );
#带有规则序列
insert into `seq` (`name`,`max`,`length`,`next`,`rules`) values ('seq_test2', '0', '3', '2','seq###max_id###');

select nextval('seq_test1');
select nextval('seq_test2');  

 

MySQL中,可以通过自定义序列(sequence)来生成唯一的ID。虽然MySQL本身没有内置的序列生成器,但可以通过使用表和触发器来实现类似的功能。下面是一个简单的示例: 首先,创建一个存储序列值的表: ```sql CREATE TABLE custom_sequence ( sequence_name VARCHAR(50) PRIMARY KEY, sequence_value BIGINT UNSIGNED NOT NULL ); ``` 然后,插入一个初始序列值: ```sql INSERT INTO custom_sequence (sequence_name, sequence_value) VALUES ('my_sequence', 0); ``` 接下来,创建一个触发器,在每次插入数据时自动递增序列值: ```sql DELIMITER // CREATE TRIGGER generate_custom_id BEFORE INSERT ON your_table FOR EACH ROW BEGIN DECLARE next_val BIGINT UNSIGNED DEFAULT 0; UPDATE custom_sequence SET sequence_value = sequence_value + 1 WHERE sequence_name = 'my_sequence'; SELECT sequence_value INTO next_val FROM custom_sequence WHERE sequence_name = 'my_sequence'; SET NEW.custom_id = next_val; END// DELIMITER ; ``` 最后,在你的表中添加一个自定义ID列(custom_id),并将触发器与该表关联: ```sql ALTER TABLE your_table ADD COLUMN custom_id BIGINT UNSIGNED; ``` ```sql ALTER TABLE your_table ADD CONSTRAINT unique_custom_id UNIQUE (custom_id); ``` 这样,每次向你的表中插入数据时,自定义ID列将会自动生成一个唯一的序列值。 请注意,这只是一个简单的示例,并且在高并发情况下可能会有性能问题。对于需要更复杂序列生成需求的情况,建议使用专门的序列生成器或考虑其他解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值