使用MySQL的LAST_INSERT_ID來確定各分表的唯一ID值
更新時(shí)間:2011年08月14日 22:57:26 作者:
MySQL數(shù)據(jù)表結(jié)構(gòu)中,一般情況下,都會(huì)定義一個(gè)具有‘AUTO_INCREMENT’擴(kuò)展屬性的‘ID’字段,以確保數(shù)據(jù)表的每一條記錄都可以用這個(gè)ID唯一確定
分表除了表名的索引不同之外,表結(jié)構(gòu)都是一樣的,如果各表的‘ID'字段仍采用‘AUTO_INCREMENT'的方式的話,ID就不能唯確定一條記錄了。
這時(shí)就需要一種處于各個(gè)分表之外的機(jī)制來生成ID,我們一般采用一張單獨(dú)的數(shù)據(jù)表(不妨假設(shè)表名為‘ticket_mutex')來保存這個(gè)ID,無論哪個(gè)分表有數(shù)據(jù)增加時(shí),都是先到ticket_mutex表把ID值加1,然后取得ID值。
這個(gè)取ID的操作看似很復(fù)雜,所幸的是,MySQL提供了LAST_INSERT_ID機(jī)制,讓我們能一步完成。
1、新建數(shù)據(jù)表ticket_mutex
CREATE TABLE ticket_mutex (
name varchar(32) NOT NULL PRIMARY KEY COMMENT '業(yè)務(wù)名稱',
value bigint(20) UNSIGNED NOT NULL COMMENT 'ID值'
)Engine=InnoDB DEFAULT CHARSET=UTF8 COMMENT '保存分表ID表';
字段‘name'用來說明這個(gè)ID是哪個(gè)業(yè)務(wù)的,比如‘用戶'的ID,我們可以定為‘USER';
字段‘value'即該業(yè)務(wù)的ID值。
2、初始化業(yè)務(wù)和其ID值
INSERT INTO ticket_mutex(name, value) values('USER', 0),('POST', 0);
+------+-------+
| name | value |
+------+-------+
| POST | 0 |
| USER | 0 |
+------+-------+
我們初始化了2條記錄,即有2個(gè)不同的業(yè)務(wù),分別代表‘用戶信息'和‘主題信息',它們初始ID值均為‘0';
3、獲取分表唯一ID
這個(gè)時(shí)候就要利用MySQL提供的LAST_INSERT_ID()機(jī)制了。
在往用戶表里新增一條數(shù)據(jù)時(shí),獲取‘用戶ID':
UPDATE ticket_mutex SET value=LAST_INSERT_ID(value+1) WHERE name='USER';SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 1 |
+------------------+
通過這條語句之后,我們得到結(jié)果為1,這個(gè)值就是我們所需要的值。再來查看數(shù)據(jù)記錄,我們發(fā)現(xiàn)記錄總數(shù)沒有改變,但是‘用戶'的ID已經(jīng)為1了;
+------+-------+
| name | value |
+------+-------+
| POST | 0 |
| USER | 1 |
+------+-------+
查看所有的記錄:
+------+-------+
| name | value |
+------+-------+
| POST | 1 |
| USER | 1 |
+------+-------+
從上可以看出,通過MySQL的LAST_INSERT_ID機(jī)制,我們可以保證在記錄總數(shù)不增長的情況下,讓業(yè)務(wù)ID在不斷的增加,從而保證了分表ID的唯一性。
4、LAST_INSERT_ID說明
從名字可以看出,LAST_INSERT_ID即為最后插入的ID值,根據(jù)MySQL的官方手冊(cè)說明,它有2種使用方法
一是不帶參數(shù):LAST_INSERT_ID(),這種方法和AUTO_INCREMENT屬性一起使用,當(dāng)往帶有‘AUTO_INCREMENT'屬性字段的表中新增記錄時(shí),LAST_INSERT_ID()即返回該字段的值,大家可試下(我已經(jīng)驗(yàn)證過);
二是帶有表達(dá)式:如上面介紹的LAST_INSERT_ID(value+1),它返回的是表達(dá)式的值,即‘value+1';
這時(shí)就需要一種處于各個(gè)分表之外的機(jī)制來生成ID,我們一般采用一張單獨(dú)的數(shù)據(jù)表(不妨假設(shè)表名為‘ticket_mutex')來保存這個(gè)ID,無論哪個(gè)分表有數(shù)據(jù)增加時(shí),都是先到ticket_mutex表把ID值加1,然后取得ID值。
這個(gè)取ID的操作看似很復(fù)雜,所幸的是,MySQL提供了LAST_INSERT_ID機(jī)制,讓我們能一步完成。
1、新建數(shù)據(jù)表ticket_mutex
復(fù)制代碼 代碼如下:
CREATE TABLE ticket_mutex (
name varchar(32) NOT NULL PRIMARY KEY COMMENT '業(yè)務(wù)名稱',
value bigint(20) UNSIGNED NOT NULL COMMENT 'ID值'
)Engine=InnoDB DEFAULT CHARSET=UTF8 COMMENT '保存分表ID表';
字段‘name'用來說明這個(gè)ID是哪個(gè)業(yè)務(wù)的,比如‘用戶'的ID,我們可以定為‘USER';
字段‘value'即該業(yè)務(wù)的ID值。
2、初始化業(yè)務(wù)和其ID值
復(fù)制代碼 代碼如下:
INSERT INTO ticket_mutex(name, value) values('USER', 0),('POST', 0);
+------+-------+
| name | value |
+------+-------+
| POST | 0 |
| USER | 0 |
+------+-------+
我們初始化了2條記錄,即有2個(gè)不同的業(yè)務(wù),分別代表‘用戶信息'和‘主題信息',它們初始ID值均為‘0';
3、獲取分表唯一ID
這個(gè)時(shí)候就要利用MySQL提供的LAST_INSERT_ID()機(jī)制了。
在往用戶表里新增一條數(shù)據(jù)時(shí),獲取‘用戶ID':
復(fù)制代碼 代碼如下:
UPDATE ticket_mutex SET value=LAST_INSERT_ID(value+1) WHERE name='USER';SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 1 |
+------------------+
通過這條語句之后,我們得到結(jié)果為1,這個(gè)值就是我們所需要的值。再來查看數(shù)據(jù)記錄,我們發(fā)現(xiàn)記錄總數(shù)沒有改變,但是‘用戶'的ID已經(jīng)為1了;
復(fù)制代碼 代碼如下:
+------+-------+
| name | value |
+------+-------+
| POST | 0 |
| USER | 1 |
+------+-------+
查看所有的記錄:
復(fù)制代碼 代碼如下:
+------+-------+
| name | value |
+------+-------+
| POST | 1 |
| USER | 1 |
+------+-------+
從上可以看出,通過MySQL的LAST_INSERT_ID機(jī)制,我們可以保證在記錄總數(shù)不增長的情況下,讓業(yè)務(wù)ID在不斷的增加,從而保證了分表ID的唯一性。
4、LAST_INSERT_ID說明
從名字可以看出,LAST_INSERT_ID即為最后插入的ID值,根據(jù)MySQL的官方手冊(cè)說明,它有2種使用方法
一是不帶參數(shù):LAST_INSERT_ID(),這種方法和AUTO_INCREMENT屬性一起使用,當(dāng)往帶有‘AUTO_INCREMENT'屬性字段的表中新增記錄時(shí),LAST_INSERT_ID()即返回該字段的值,大家可試下(我已經(jīng)驗(yàn)證過);
二是帶有表達(dá)式:如上面介紹的LAST_INSERT_ID(value+1),它返回的是表達(dá)式的值,即‘value+1';
您可能感興趣的文章:
- mysql數(shù)據(jù)庫分表分庫的策略
- MySQL 5.7雙主同步部分表的實(shí)現(xiàn)過程詳解
- MyBatis實(shí)現(xiàn)Mysql數(shù)據(jù)庫分庫分表操作和總結(jié)(推薦)
- 什么是分表和分區(qū) MySql數(shù)據(jù)庫分區(qū)和分表方法
- Mysql數(shù)據(jù)庫性能優(yōu)化三(分表、增量備份、還原)
- MYSQL數(shù)據(jù)庫數(shù)據(jù)拆分之分庫分表總結(jié)
- MySQL分表自增ID問題的解決方法
- PHP操作mysql數(shù)據(jù)庫分表的方法
- Mysql數(shù)據(jù)庫分庫和分表方式(常用)
- 1億條數(shù)據(jù)如何分表100張到Mysql數(shù)據(jù)庫中(PHP)
- php實(shí)現(xiàn)mysql數(shù)據(jù)庫分表分段備份
- mysql分表和分區(qū)的區(qū)別淺析
- mysql的3種分表方案
- MySQL分表實(shí)現(xiàn)上百萬上千萬記錄分布存儲(chǔ)的批量查詢?cè)O(shè)計(jì)模式詳解
- MYSQL性能優(yōu)化分享(分庫分表)
- MySQL動(dòng)態(tài)創(chuàng)建表,數(shù)據(jù)分表的存儲(chǔ)過程
- MySQL 分表優(yōu)化試驗(yàn)代碼
- mysql分表分庫的應(yīng)用場(chǎng)景和設(shè)計(jì)方式
相關(guān)文章

MySQL核心參數(shù)優(yōu)化文件my.ini實(shí)現(xiàn)
本文主要介紹了MySQL核心參數(shù)優(yōu)化文件my.ini實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
2023-01-01 
MySQL?數(shù)據(jù)類型及最優(yōu)選取規(guī)則
這篇文章主要介紹了MySQL?數(shù)據(jù)類型及最優(yōu)選取規(guī)則,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助
2022-08-08