如果你不想使用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.测试
mysql> SELECT seq('one'),seq('two'),seq('one'),seq('one');
+------------+------------+------------+------------+
| seq('one') | seq('two') | seq('one') | seq('one') |
+------------+------------+------------+------------+
| 102 | 1002 | 103 | 104 |
+------------+------------+------------+------------+
1 row IN SET (0.00 sec)
分享到:


2009-10-21 22:58
浏览 2834
论坛回复 / 浏览 (6 / 8069)
分类:数据库
评论
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
可否深入详细的讲解一下,如何运用?可以应用在什么地方。
谢谢