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

作者:gallop_liu 时间:2024-01-13 07:52:58 

本文利用 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的相关资料,希望大家喜欢。

标签:mysql,扩展,全局,id
0
投稿

猜你喜欢

  • Maui Blazor 使用摄像头实现代码

    2023-12-06 11:44:37
  • layui使用button按钮 点击出现弹层 弹层中加载表单的实例

    2024-05-02 17:22:15
  • JS设置cookie、读取cookie、删除cookie

    2023-08-27 19:35:17
  • 基于python分享一款地理数据可视化神器keplergl

    2023-09-27 20:54:05
  • 详解Pandas之容易让人混淆的行选择和列选择

    2023-01-15 05:12:57
  • 在cmd中运行.py文件: python的操作步骤

    2021-10-01 08:40:47
  • SpringBoot 中使用JSP的方法示例

    2023-06-16 22:35:09
  • JavaScript中使用ActiveXObject操作本地文件夹的方法

    2024-04-17 09:48:32
  • vue 解决data中定义图片相对路径页面不显示的问题

    2024-04-30 10:24:52
  • 关于javascript中伪数组和真数组的一些小秘密

    2023-07-02 03:47:47
  • 仿迅雷焦点广告效果(JQuery版)

    2009-08-03 14:18:00
  • MySQL数据库同时查询更新同一张表的方法

    2024-01-22 23:10:38
  • Python实现的远程文件自动打包并下载功能示例

    2021-03-25 04:45:51
  • python assert断言的实例用法

    2023-06-24 22:15:42
  • Python常用内置函数的使用教程详解

    2021-11-11 21:23:50
  • Python实现的Kmeans++算法实例

    2023-01-05 22:28:36
  • Windows11使用Cpython 编译文件报错 error: Unable to find vcvarsall.bat 完美解决方法

    2021-03-14 19:03:19
  • Python sklearn CountVectorizer使用详解

    2023-06-20 08:19:05
  • 一个不错的javascript加密解密算法源码

    2010-03-28 13:12:00
  • 有关于IE8 Beta 1两个提醒

    2008-05-15 12:32:00
  • asp之家 网络编程 m.aspxhome.com