加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

Mysql学习基于MySql的扩展功能生成全局ID

发布时间:2020-12-12 03:12:24 所属栏目:MySql教程 来源:网络整理
导读:《Mysql学习基于MySql的扩展功能生成全局ID》要点: 本文介绍了Mysql学习基于MySql的扩展功能生成全局ID,希望对您有用。如果有疑问,可以联系我们。 MYSQL教程 本文利用 MySQL的扩展功能 REPLACE INTO 来生成全局id,REPLACE INTO和INSERT的功能一样,但是当

《Mysql学习基于MySql的扩展功能生成全局ID》要点:
本文介绍了Mysql学习基于MySql的扩展功能生成全局ID,希望对您有用。如果有疑问,可以联系我们。

MYSQL教程本文利用 MySQL的扩展功能 REPLACE INTO 来生成全局id,REPLACE INTO和INSERT的功能一样,但是当使用REPLACE INTO插入新数据行时,如果新插入的行的主键或唯一键(UNIQUE Key)已有的行重复时,已有的行会先被删除,然后再将新数据行插入(REPLACE INTO 是原始操作).

MYSQL教程建立类似下面的表:

MYSQL教程
CREATE TABLE `tickets64` ( 
  `id` bigint(20) unsigned NOT NULL auto_increment,`stub` char(1) NOT NULL default '',PRIMARY KEY (`id`),UNIQUE KEY `stub` (`stub`) 
) ENGINE=MyISAM; 

MYSQL教程当需要获得全局唯一ID时,执行下面的SQL语句:

MYSQL教程
REPLACE INTO `tickets64` (`stub`) VALUES ('a'); 
SELECT LAST_INSERT_ID(); 

MYSQL教程第一次执行这个语句后,ticket64表将包含以下数据:

MYSQL教程+--------+------+?
| id???? | stub |?
+--------+------+?
| 1????? |??? a |?
+--------+------+??

MYSQL教程以后再次执行前面的语句,stub字段值为'a'的行已经存在,所以MySQL会先删除这一行,再插入.因此,第二次执行后,ticket64表还是只有一行数据,只是id字段的值为2.这个表将一直只有一行数据.

MYSQL教程更棒的方法:

MYSQL教程????? 比如,只需要一张ticket表就可以为所有的业务表提供各自连续的ID.下面,来看一下我们的方法.首先来看一下表结构:

MYSQL教程
CREATE TABLE `sequence` ( 
  `name` varchar(50) NOT NULL,`id` bigint(20) unsigned NOT NULL DEFAULT '0',PRIMARY KEY (`name`) 
) ENGINE=InnoDB; 

MYSQL教程?注意区别,id字段不是自增的,也不是主键.在使用前,我们需要先插入一些初始化数据:

MYSQL教程
INSERT INTO `sequence` (`name`) VALUES  
('users'),('photos'),('albums'),('comments'); 

MYSQL教程接下来,我们可以通过执行下面的SQL语句来获得新的照片ID:

MYSQL教程
UPDATE `sequence` SET `id` = LAST_INSERT_ID(`id` + 1) WHERE `name` = 'photos'; 
SELECT LAST_INSERT_ID(); 

MYSQL教程我们执行了一个更新操作,将id字段增加1,并将增加后的值传递到LAST_INSERT_ID函数,从而指定了LAST_INSERT_ID的返回值.

MYSQL教程实际上,我们不一定需要预先指定序列的名字.如果我们现在需要一种新的序列,我们可以直接执行下面的SQL语句:

MYSQL教程
INSERT INTO `sequence` (`name`) VALUES('new_business') ON DUPLICATE KEY UPDATE `id` = LAST_INSERT_ID(`id` + 1); 
SELECT LAST_INSERT_ID();

MYSQL教程???? 这里,我们采用了INSERT … ON DUPLICATE KEY UPDATE这个MySQL扩展,这个扩展的功能也和INSERT一样插入一行新的记录,但是当新插入的行的主键或唯一键(UNIQUE Key)和已有的行重复时,会对已有行进行UPDATE操作.

MYSQL教程当我们第一次执行上面的语句时,因为还没有name为'new_business'的字段,所以正常的执行了插入操作,需要注意的是通过这种方式获取的序列起始值为0,而不是1.因为第一次执行时,没有执行UPDATE,所以也没有为LAST_INSERT_ID传递值,我们也没有自增字段,所以SELECT LAST_INSERT_ID()将返回0.不过这个应该不是什么大问题.

MYSQL教程UPDATE: 这个方法更容易解决单点问题,也不局限于两个服务器,只要对不同的服务器设置不同的初始值(但必须是连续的),然后将增量变为服务器数就行了.

MYSQL教程以上内容是基于MySql的扩展功能生成全局ID的相关资料,希望大家喜欢.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读