网站的用户Id比如"237060385"这个数是怎么生成的?

KaneTing 2011-05-30 10:33:41
发现在很多网站注册的时候,都会被分配到一个id,所以请问这个id是怎么生成的?是按照什么逻辑去生成的?在数据库中怎么实现的?譬如Mysql
比如人人网ID:http://www.renren.com/profile.do?id=237060385,就是237060385这个数是怎么生成的吗?
...全文
428 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
KaneTing 2011-05-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fellatioyzx 的回复:]
规则自己定,最容易想到的是自增键,其它的比如你要想然这个ID有点意义的话,可以是申请ID的地域ID+当然时间戳+什么什么的,只要不重复不就行了
[/Quote]
感觉说的对啊!
我现在也想实现这一功能,能推荐一下用什么样的规则吗?
其次我感觉像你说的这种id的生成应该是在程序中实现的吧,而不是在数据库中吧,在后台服务器程序执行请求时生成的吧
KaneTing 2011-05-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 acmain_chm 的回复:]
MYSQL中可以直接使用 自增字段属性 auto_increment , 这样数据库会自动产生这个序列号。
[/Quote]
这样的话,就是说id从1开始,然后每次插入一行数据,都会使得id的值自动加1,就像你说的那样,这个确实是实现了自动递增。
不过,这样的话,感觉和我说的Id有些差别。因为你说的Id是从1开始的,但是我在“世纪佳缘”网的时候,如果按你说的那样Id用1、2、3..等等来搜索会员时,是没有结果的,这是为什么呢?同样,我在人人网上这样搜索时也是这样啊
是不是他们的实现方式不是这样的呢?
fellatioyzx 2011-05-30
  • 打赏
  • 举报
回复
规则自己定,最容易想到的是自增键,其它的比如你要想然这个ID有点意义的话,可以是申请ID的地域ID+当然时间戳+什么什么的,只要不重复不就行了
ACMAIN_CHM 2011-05-30
  • 打赏
  • 举报
回复
[Quote]3.6.9. 使用AUTO_INCREMENT
可以通过AUTO_INCREMENT属性为新的行产生唯一的标识:

CREATE TABLE animals (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (id)
);

INSERT INTO animals (name) VALUES
('dog'),('cat'),('penguin'),
('lax'),('whale'),('ostrich');

SELECT * FROM animals;
将返回:

+----+---------+
| id | name |
+----+---------+
| 1 | dog |
| 2 | cat |
| 3 | penguin |
| 4 | lax |
| 5 | whale |
| 6 | ostrich |
+----+---------+
你可以使用LAST_INSERT_ID()SQL函数或mysql_insert_id() C API函数来查询最新的AUTO_INCREMENT值。这些函数与具体连接有关,因此其返回值不会被其它执行插入功能的连接影响。

注释:对于多行插入,LAST_INSERT_ID()和mysql_insert_id()从插入的第一行实际返回AUTO_INCREMENT关键字。在复制设置中,通过该函数可以在其它服务器上正确复制多行插入。

对于MyISAM和BDB表,你可以在第二栏指定AUTO_INCREMENT以及多列索引。此时,AUTO_INCREMENT列生成的值的计算方法为:MAX(auto_increment_column) + 1 WHERE prefix=given-prefix。如果想要将数据放入到排序的组中可以使用该方法。

CREATE TABLE animals (
grp ENUM('fish','mammal','bird') NOT NULL,
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (grp,id)
);

INSERT INTO animals (grp,name) VALUES
('mammal','dog'),('mammal','cat'),
('bird','penguin'),('fish','lax'),('mammal','whale'),
('bird','ostrich');

SELECT * FROM animals ORDER BY grp,id;
将返回:

+--------+----+---------+
| grp | id | name |
+--------+----+---------+
| fish | 1 | lax |
| mammal | 1 | dog |
| mammal | 2 | cat |
| mammal | 3 | whale |
| bird | 1 | penguin |
| bird | 2 | ostrich |
+--------+----+---------+
请注意在这种情况下(AUTO_INCREMENT列是多列索引的一部分),如果你在任何组中删除有最大AUTO_INCREMENT值的行,将会重新用到AUTO_INCREMENT值。对于MyISAM表也如此,对于该表一般不重复使用AUTO_INCREMENT值。

如果AUTO_INCREMENT列是多索引的一部分,MySQL将使用该索引生成以AUTO_INCREMENT列开始的序列值。。例如,如果animals表含有索引PRIMARY KEY (grp, id)和INDEX(id),MySQL生成序列值时将忽略PRIMARY KEY。结果是,该表包含一个单个的序列,而不是符合grp值的序列。

要想以AUTO_INCREMENT值开始而不是1,你可以通过CREATE TABLE或ALTER TABLE来设置该值,如下所示:

mysql> ALTER TABLE tbl AUTO_INCREMENT = 100;
关于AUTO_INCREMENT的详细信息:

· 如何为列指定AUTO_INCREMENT属性:13.1.5节,“CREATE TABLE语法”和 13.1.2节,“ALTER TABLE语法”。

· AUTO_INCREMENT的动作取决于SQL模式:5.3.2节,“SQL服务器模式”。

· 找出含有最新AUTO_INCREMENT值的行:12.1.3节,“比较函数和操作符”。

· 设置将用到的AUTO_INCREMENT值: 13.5.3节,“SET语法” 。

· AUTO_INCREMENT和复制:6.7节,“复制特性和已知问题”.

· AUTO_INCREMENT相关的可用于复制的Server-system变量(auto_increment_increment和auto_increment_offset):5.3.3节,“服务器系统变量”。


[/Quote]
ACMAIN_CHM 2011-05-30
  • 打赏
  • 举报
回复
MYSQL中可以直接使用 自增字段属性 auto_increment , 这样数据库会自动产生这个序列号。
rucypli 2011-05-30
  • 打赏
  • 举报
回复
bingint类型的自增列
加油馒头 2011-05-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xiaoyousifang 的回复:]
引用 4 楼 fellatioyzx 的回复:
规则自己定,最容易想到的是自增键,其它的比如你要想然这个ID有点意义的话,可以是申请ID的地域ID+当然时间戳+什么什么的,只要不重复不就行了

感觉说的对啊!
我现在也想实现这一功能,能推荐一下用什么样的规则吗?
其次我感觉像你说的这种id的生成应该是在程序中实现的吧,而不是在数据库中吧,在后台服务器程序执行请求时生成的吧
[/Quote]

用自增就可以实现了,简单方便
加油馒头 2011-05-30
  • 打赏
  • 举报
回复
你可以从 200000 开始 自增。。。
ACMAIN_CHM 2011-05-30
  • 打赏
  • 举报
回复
[Quote]这样的话,就是说id从1开始,然后每次插入一行数据,都会使得id的值自动加1,就像你说的那样,这个确实是实现了自动递增。
不过,这样的话,感觉和我说的Id有些差别。因为你说的Id是从1开始的,但是我在“世纪佳缘”网的时候,如果按你说的那样Id用1、2、3..等等来搜索会员时,是没有结果的,这是为什么呢?同样,我在人人网上这样搜索时也是这样啊
是不是他们的实现方式不是这样的呢?[/Quote]你可以设置从10000开始。

56,677

社区成员

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

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