`

mysql 序列号生成器

阅读更多

      如果你不想使用mysql的自动递增,但又想实现主键序列号的功能,可以使用下面的方法,通过函数用一张表去维护生成多个表的序列号,简单又实用

     

1.创建生成多个表的序列号的数据维护表

CREATE TABLE seq (
  name varchar(20) NOT NULL,
  val int(10) UNSIGNED NOT NULL,
  PRIMARY KEY  (name)
) ENGINE=MyISAM DEFAULT CHARSET=UTF-8

 

2.插入几条初始化数据

INSERT INTO seq VALUES('one',100);
INSERT INTO seq VALUES('two',1000);

 

3.创建函数以生成序列号

CREATE FUNCTION seq(seq_name char (20)) returns int
begin
 UPDATE seq SET val=last_insert_id(val+1) WHERE name=seq_name;
 RETURN last_insert_id();
end

 

4.测试

  1. mysql> SELECT seq('one'),seq('two'),seq('one'),seq('one');
  2. +------------+------------+------------+------------+
  3. | seq('one') | seq('two') | seq('one') | seq('one') |
  4. +------------+------------+------------+------------+
  5. |        102 |       1002 |        103 |        104 |
  6. +------------+------------+------------+------------+
  7. 1 row IN SET (0.00 sec)
分享到:
评论
6 楼 pekkle 2009-12-30  
说白了,就是用一张表来记录,没意思。并发就死了
5 楼 coolzhi 2009-11-09  
nuthell 写道
可否深入详细的讲解一下,如何运用?可以应用在什么地方。

谢谢


本人主要是应用于数据插入时自动生成一个短标识,这样生成静态html或者做伪静态的时候的链接比较容易让搜索引擎或者人记住,没有考虑到并发性能问题
4 楼 方世玉 2009-11-09  
每次是update加1,性能很差,大批量的情况下会有问题的
相比之下,oracle是可以提前锁定一批序列号,存放在内存里面的。
3 楼 xiaoych 2009-11-09  
性能会比较差吧……
2 楼 hardPass 2009-11-09  
这种东西,其实没有什么意义。

可以由应用程序来生成有序的id,方便操作,更方便取刚插入的ID,而不需要考虑并发等问题。

如果用一个服务做这个工作,还方便集群。
1 楼 nuthell 2009-11-09  
可否深入详细的讲解一下,如何运用?可以应用在什么地方。

谢谢

相关推荐

Global site tag (gtag.js) - Google Analytics