用MySQL的擴充套件功能生成全域性ID

2021-08-31 10:11:50 字數 2191 閱讀 7763

本文利用 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: 這個方法更容易解決單點問題,也不侷限於兩個伺服器,只要對不同的伺服器設定不同的初始值(但必須是連續的),然後將增量變為伺服器數就行了。 

注:此文章**於網路:

Python 生成全0矩陣的方法

1.使用numpy生成0矩陣 1 np.zeros 行數,列數 import numpy as np 生成乙個兩行,三列的矩陣 np.zeros 2,3 out 2 array 0.0.0.0.0.0.2 np.full 行數,列數 填充的數值 這種方法相對於第一種方法更加的通用,可以指定填充的數值...

用C語言擴充套件Python的功能的例項

分類 c c 程式設計技巧 programes 2008 04 23 09 31 1232人閱讀收藏 舉報python 擴充套件語言 cmethods null 這裡檢視關於用c語言擴充套件python的功能 只要安裝了python,在用c進行python的擴充套件程式設計時不需要額外安裝任何東西,...

擴充套件的UDDI功能

擴充套件的uddi功能 現有的uddi系統只提供服務的發布和查詢功能,一方面它不能滿足通常情況下,服務消費者需要在使用web服務前要了解的有關該服務服務質量 qos 方面的資訊,另一方面也沒有解決uddi在語義方面的缺陷。於是在研究傳統uddi規範的基礎上,我們對它進行了適當地改進與擴充,設計了擴充...