欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于MySql的擴(kuò)展功能生成全局ID

 更新時(shí)間:2015年12月12日 11:00:05   作者:gallop_liu  
本文借用 MySQL的擴(kuò)展功能 REPLACE INTO 來(lái)生成全局id,REPLACE INTO和INSERT的功能一樣,但是當(dāng)使用REPLACE INTO插入新數(shù)據(jù)行時(shí),如果新插入的行的主鍵或唯一鍵(UNIQUE Key)已有的行重復(fù)時(shí),已有的行會(huì)先被刪除,然后再將新數(shù)據(jù)行插入

本文利用 MySQL的擴(kuò)展功能 REPLACE INTO 來(lái)生成全局id,REPLACE INTO和INSERT的功能一樣,但是當(dāng)使用REPLACE INTO插入新數(shù)據(jù)行時(shí),如果新插入的行的主鍵或唯一鍵(UNIQUE Key)已有的行重復(fù)時(shí),已有的行會(huì)先被刪除,然后再將新數(shù)據(jù)行插入(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; 

當(dāng)需要獲得全局唯一ID時(shí),執(zhí)行下面的SQL語(yǔ)句:

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

第一次執(zhí)行這個(gè)語(yǔ)句后,ticket64表將包含以下數(shù)據(jù):

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

以后再次執(zhí)行前面的語(yǔ)句,stub字段值為'a'的行已經(jīng)存在,所以MySQL會(huì)先刪除這一行,再插入。因此,第二次執(zhí)行后,ticket64表還是只有一行數(shù)據(jù),只是id字段的值為2。這個(gè)表將一直只有一行數(shù)據(jù)。

更棒的方法:

      比如,只需要一張ticket表就可以為所有的業(yè)務(wù)表提供各自連續(xù)的ID。下面,來(lái)看一下我們的方法。首先來(lái)看一下表結(jié)構(gòu):

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

 注意區(qū)別,id字段不是自增的,也不是主鍵。在使用前,我們需要先插入一些初始化數(shù)據(jù):

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

接下來(lái),我們可以通過(guò)執(zhí)行下面的SQL語(yǔ)句來(lái)獲得新的照片ID:

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

我們執(zhí)行了一個(gè)更新操作,將id字段增加1,并將增加后的值傳遞到LAST_INSERT_ID函數(shù),從而指定了LAST_INSERT_ID的返回值。

實(shí)際上,我們不一定需要預(yù)先指定序列的名字。如果我們現(xiàn)在需要一種新的序列,我們可以直接執(zhí)行下面的SQL語(yǔ)句:

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這個(gè)MySQL擴(kuò)展,這個(gè)擴(kuò)展的功能也和INSERT一樣插入一行新的記錄,但是當(dāng)新插入的行的主鍵或唯一鍵(UNIQUE Key)和已有的行重復(fù)時(shí),會(huì)對(duì)已有行進(jìn)行UPDATE操作。

當(dāng)我們第一次執(zhí)行上面的語(yǔ)句時(shí),因?yàn)檫€沒(méi)有name為'new_business'的字段,所以正常的執(zhí)行了插入操作,需要注意的是通過(guò)這種方式獲取的序列起始值為0,而不是1。因?yàn)榈谝淮螆?zhí)行時(shí),沒(méi)有執(zhí)行UPDATE,所以也沒(méi)有為L(zhǎng)AST_INSERT_ID傳遞值,我們也沒(méi)有自增字段,所以SELECT LAST_INSERT_ID()將返回0。不過(guò)這個(gè)應(yīng)該不是什么大問(wèn)題。

UPDATE: 這個(gè)方法更容易解決單點(diǎn)問(wèn)題,也不局限于兩個(gè)服務(wù)器,只要對(duì)不同的服務(wù)器設(shè)置不同的初始值(但必須是連續(xù)的),然后將增量變?yōu)榉?wù)器數(shù)就行了。

以上內(nèi)容是基于MySql的擴(kuò)展功能生成全局ID的相關(guān)資料,希望大家喜歡。

相關(guān)文章

  • SQL實(shí)現(xiàn)LeetCode(176.第二高薪水)

    SQL實(shí)現(xiàn)LeetCode(176.第二高薪水)

    這篇文章主要介紹了SQL實(shí)現(xiàn)LeetCode(176.第二高薪水),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • MySQL中select語(yǔ)句使用order按行排序

    MySQL中select語(yǔ)句使用order按行排序

    本文介紹MySQL數(shù)據(jù)庫(kù)中執(zhí)行select查詢語(yǔ)句,并對(duì)查詢的結(jié)果使用order by 子句進(jìn)行排序
    2016-04-04
  • 關(guān)于SqlServer中datediff用法

    關(guān)于SqlServer中datediff用法

    datediff是SQL SERVER里面的用法,ORACLE沒(méi)有,主要作用是返回兩個(gè)日期之間的時(shí)間間隔,本文通過(guò)實(shí)例代碼給大家詳細(xì)講解,對(duì)datediff用法感興趣的朋友跟隨小編一起看看吧
    2022-11-11
  • windows系統(tǒng)mysql壓縮包版本安裝過(guò)程

    windows系統(tǒng)mysql壓縮包版本安裝過(guò)程

    這篇文章主要介紹了windows系統(tǒng)mysql壓縮包版本安裝過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • Mysql多表關(guān)聯(lián)更新方式

    Mysql多表關(guān)聯(lián)更新方式

    這篇文章主要介紹了Mysql多表關(guān)聯(lián)更新方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 一文帶你徹底了解MySQL事務(wù)機(jī)制

    一文帶你徹底了解MySQL事務(wù)機(jī)制

    一個(gè)事情由n個(gè)單元組成,這n個(gè)單元在執(zhí)行過(guò)程中,要么同時(shí)成功,要么同時(shí)失敗,這就把n個(gè)單元放在了一個(gè)事務(wù)之中,這篇文章主要給大家詳細(xì)介紹MySQL的事務(wù)機(jī)制,感興趣的同學(xué)歡迎閱讀本文
    2023-06-06
  • mysql中如何去除小數(shù)點(diǎn)后面多余的0

    mysql中如何去除小數(shù)點(diǎn)后面多余的0

    這篇文章主要介紹了mysql 中去除小數(shù)點(diǎn)后面多余的0的方法 ,需要的朋友可以參考下
    2014-03-03
  • MySQL常見(jiàn)錯(cuò)誤有哪些_MySQL常見(jiàn)錯(cuò)誤的快速解決方法

    MySQL常見(jiàn)錯(cuò)誤有哪些_MySQL常見(jiàn)錯(cuò)誤的快速解決方法

    MySQL常見(jiàn)錯(cuò)誤有哪些呢?下面小編就為大家?guī)?lái)一篇MySQL常見(jiàn)錯(cuò)誤的快速解決方法?,F(xiàn)在分享個(gè)大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-03-03
  • mysql安全啟動(dòng)腳本mysqld_safe詳細(xì)介紹

    mysql安全啟動(dòng)腳本mysqld_safe詳細(xì)介紹

    這篇文章主要介紹了mysql安全啟動(dòng)腳本mysqld_safe詳細(xì)介紹,mysqld_safe增加了一些安全特性,需要的朋友可以參考下
    2014-07-07
  • Mysql通過(guò)存儲(chǔ)過(guò)程分割字符串為數(shù)組

    Mysql通過(guò)存儲(chǔ)過(guò)程分割字符串為數(shù)組

    今天小編就為大家分享一篇關(guān)于Mysql通過(guò)存儲(chǔ)過(guò)程分割字符串為數(shù)組,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03

最新評(píng)論