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

 更新时间:2015年12月12日 11:00:05   作者:gallop_liu  
本文借用 MySQL的扩展功能 REPLACE INTO 来生成全局id,REPLACE INTO和INSERT的功能一样,但是当使用REPLACE INTO插入新数据行时,如果新插入的行的主键或唯一键(UNIQUE Key)已有的行重复时,已有的行会先被删除,然后再将新数据行插入

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

建立类似下面的表:

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; 

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

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

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

+--------+------+ 
| id     | stub | 
+--------+------+ 
| 1      |    a | 
+--------+------+  

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

更棒的方法:

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

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

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

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

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

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

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

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

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

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

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

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

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

相关文章

  • centos6.5下mysql 5.7.19 安装配置方法

    centos6.5下mysql 5.7.19 安装配置方法

    这篇文章主要为大家详细介绍了centos6.5下mysql 5.7.19 安装配置方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • Mysql 如何实现多张无关联表查询数据并分页

    Mysql 如何实现多张无关联表查询数据并分页

    这篇文章主要介绍了Mysql 实现多张无关联表查询数据并分页的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • MySQL服务维护笔记

    MySQL服务维护笔记

    MySQL服务维护笔记...
    2006-12-12
  • Mysql如何通过binlog日志恢复数据详解

    Mysql如何通过binlog日志恢复数据详解

    binlog日志用于记录所有更新了数据或者已经潜在更新了数据的所有语句,下面这篇文章主要给大家介绍了关于Mysql如何通过binlog日志恢复数据的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • MySQL免安装版(zip)安装配置详细教程

    MySQL免安装版(zip)安装配置详细教程

    这篇文章主要为大家详细介绍了MySQL免安装版(zip)安装配置详细教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • 超详细MySQL8.0.22安装及配置教程

    超详细MySQL8.0.22安装及配置教程

    这篇文章主要介绍了超详细MySQL8.0.22安装及配置教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 详细聊一聊mysql的树形结构存储以及查询

    详细聊一聊mysql的树形结构存储以及查询

    由于mysql是关系型数据库,因此对于类似组织架构,子任务等相关的树形结构的处理不是很友好,下面这篇文章主要给大家介绍了关于mysql树形结构存储以及查询的相关资料,需要的朋友可以参考下
    2022-04-04
  • MySQL之mysqldump的使用详解

    MySQL之mysqldump的使用详解

    这篇文章主要介绍了MySQL之mysqldump的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • MySQL分区之LIST分区详解

    MySQL分区之LIST分区详解

    mysql分区之LIST分区讲解 MySQL中的LIST分区在很多方面类似于RANGE分区,下面这篇文章主要给大家介绍了关于MySQL分区之LIST分区的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • 如何解决MySQL安装遇到Start service红叉问题

    如何解决MySQL安装遇到Start service红叉问题

    在安装MySQL时,若遇到StartService步骤打红叉无法继续,可通过计算机管理以管理员身份运行服务,找到MySQL服务,更改为本地系统账户登录,解决安装问题,此方法为实际操作经验,可供参考,确保安装顺利完成
    2024-10-10

最新评论