1. 程式人生 > >MySQL UUID函式和自增序列詳解

MySQL UUID函式和自增序列詳解

MySQL UUID函式的詳解

MySQL中可以有二類用於生成唯一值性質的工具:UUID()函式和自增序列,那麼二者有何區別呢?我們就此對比下各自的特性及異同點:

l  都可以實現生成唯一值的功能;

l  UUID是可以生成時間、空間上都獨一無二的值;自增序列只能生成基於表內的唯

一值,且需要搭配使其為唯一的主鍵或唯一索引;

l  實現方式不一樣,UUID是隨機+規則組合而成的,而自增序列是控制一個值逐步增長的;

l  UUID產生的是字串型別值,固定長度為:36個字元,而自增序列產生的是整數型別值,長度由欄位定義屬性決定;

接下來,詳細講解下UUID()函式產生的值:

[email protected]

: (none) 06:09:40> SELECT UUID(),UUID(),LENGTH(UUID()),CHAR_LENGTH(UUID())\G

*************************** 1. row ***************************

(注:其中 \G代表前一個匹配的結束   參考建:http://wenku.baidu.com/view/f5e5dcf07c1cfad6195fa711.html)

UUID(): de7ee638-4322-11e0-85ab-842b2b4a7e75

UUID(): de7ee642-4322-11e0-85ab-842b2b4a7e75

LENGTH(UUID()): 36

CHAR_LENGTH(UUID()): 36

1 row in set (0.00 sec)

從上面的執行結果部分的資訊看

l  同一個SQL語句中,多處呼叫UUID()函式得到的值不相同;

l  得到的隨機值由5個部分組成,且分隔符位為:中劃線;

l  多次呼叫或執行得到的後2組值相同,若把mysqld伺服器關閉,重新啟動之後,會發現第四組的組與未重啟前的值發生變化,然後一直不變化,只要重新啟動mysqld服務就會發生變化。另外,對於同一臺機器,第五組值始終不會發生變化;

l  字元個數為:36,佔位元組數為:36(注:系統預設字符集編碼:utf8);

針對UUID產生的值組成部分,作如下解說:

l  前三組值是時間戳換算過來的;

l  第四組值是暫時性保持時間戳的唯一性。例如,使用夏令時;

l  第五組值是一個IEE 802的節點標識值,它是空間上唯一的。若後者不可用,則用一個隨機數字替換。假如主機沒有網絡卡,或者我們不知道如何在某系統下獲得機器地址,則空間唯一性就不能得到保證,即使這楊,出現重複值的機率還是非常小的。

UUID函式對複製的支援:

UUID函式屬於不確定性函式,為此不支援MySQL 複製的STATEMENT模式,但是支援MIXED、ROW二種模式,大家可以設定2組測試模式,以5.1.系列版本為例。

測試基於命令列模式複製:

tx_isolation = REPEATABLE-READ

binlog_format = STATEMENT

測試基於命令列/混合模式複製:

tx_isolation = REPEATABLE-READ

binlog_format = MIXED  OR ROW

在主伺服器上執行同一個SQL語句:

INSERT INTO  test_uuid(username) VALUES(UUID());

然後再比對主從伺服器上表中儲存的值,會發現基於命令列模式的:主從不一致,基於行/混合模式的:主從資料時一致;

建議:在複製模式下,需要用到UUID()函式,則一定要使用基於行/混合模式複製方式。

名詞解釋:

對於輸入引數相同,且同一時間執行或一個SQL中多處呼叫,而得到不同值得函式,我們就稱其為:不確定性函式

備註:

在MySQL 5.1.*及更高版本有一個變種的UUID()函式,名稱:UUID_SHORT(),生成一個64位無符號的整數,例如:

[email protected] : (none) 02:46:42> SELECT UUID_SHORT()\G

*************************** 1. row ***************************

UUID_SHORT(): 6218676250261585921

1 row in set (0.00 sec)

後續加註:

後續新增的:

在mysql中,可以使用uuid 來生成主鍵,但是用mysql的uuid()函式 ,生成的uuid是36位的,其中包含32個字元以及4個分隔符(-),往往這個分隔符對我們來說是沒有用的,可以使用mysql自帶的replace函式去掉分隔符

replace(uuid(),'-','')   ---->將uuid()中的‘-’,去掉,即替換成空串;

此外

upper(replace(uuid(),'-',''))用於將字元轉換為大寫

相關推薦

MySQL UUID函式序列

MySQL UUID函式的詳解 MySQL中可以有二類用於生成唯一值性質的工具:UUID()函式和自增序列,那麼二者有何區別呢?我們就此對比下各自的特性及異同點: l  都可以實現生成唯一值的功能; l  UUID是可以生成時間、空間上都獨一無二的值;自增序列只能

MySQL中生成唯一值性質的工具UUID()序列

同:都可以生成唯一值; 異: UUID()是可以生成時間、空間上都獨一無二的值;自增序列只能生成基於表內的唯一值,且需要搭配使其為唯一的主鍵或唯一索引;         實現方式不一樣,UUID()是隨機+規則組合而成的,而自增序列是控制一個值逐步增長的;     

mysql分表表分區

sql char 根據 blank 服務端 lpad one urn 聯系 為什麽要分表和分區? 日常開發中我們經常會遇到大表的情況,所謂的大表是指存儲了百萬級乃至千萬級條記錄的表。這樣的表過於龐大,導致數據庫在查詢和插入的時候耗時太長,性能低下,如果涉及聯合查詢的情況,性

響應式佈局適應佈局

注:響應式佈局等於流動網格佈局,而自適應佈局等於使用固定分割點來進行佈局。 自適應佈局給了你更多設計的空間,因為你只用考慮幾種不同的狀態。而在響應式佈局中你卻得考慮上百種不同的狀態。雖然絕大部分狀態差異較小,但仍然也算做差異。它使得把握設計最終效果變得更難,同樣讓響

mybatis的insert插入後獲取id(從controller到mapper)

需求說明:當執行插入操作的時候,其中資料包含兩個模組,分別存放在兩種資料庫表中,拿表A,表B來說。 表A為基本資訊表,其中插入時候有自增id,也就是每新增一條資料後下一個id都會自動加1。 表B為詳情表,其中有個欄位為A_id與A表中的id是一樣的,也就是他們的關聯欄位。 那麼問

SG函式SG定理【

在介紹SG函式和SG定理之前我們先介紹介紹必勝點與必敗點吧. 必勝點和必敗點的概念:         P點:必敗點,換而言之,就是誰處於此位置,則在雙方操作正確的情況下必敗。    &n

【C/C++】運算子++

關於 a = 2 * a++ *(3 –  ++a)的運算過程分析: 將以上原始碼進行反彙編之後的結果如下:        int a = 2; 00C313DE mov         dword ptr [a],2  // a = 2;        a = 2 * a

python介面自動化(三十四)-封裝與呼叫--函式引數化(

簡介   前面雖然實現了引數的關聯,但是那種只是記流水賬的完成功能,不便於維護,也沒什麼可讀性,隨著水平和技能的提升,再返回頭去看前邊寫的程式碼,簡直是慘不忍睹那樣的程式碼是初級入門的程式碼水平都達不到。接下來這篇由我帶領小夥伴們把每一 個滑鼠點選動作寫成一個函式,這樣更方便維護了,而且可讀性也高,後期其

Mysql主鍵選擇之UUID主鍵

引言之前有段時間用postgresql 資料庫,在上雲之後,從自增主鍵變為uuid,感覺uuid全球唯一,很方便。最近用mysql,發現mysql主鍵都是選擇自增主鍵,仔細比較一下,為什麼mysql選擇自增主鍵,有什麼不同。在mysql5.0之前,如果是多個master複製的

MySQL基礎篇(03):系統定義函式總結,觸發器使用

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、系統封裝函式 MySQL 有很多內建的函式,可以快速解決開發中的一些業務需求,大概包括流程控制函式,數值型函式、字串型函式、日期時間函式、聚合函式等。以下列出了這些分類中常用的函式。 1、控制流程函式 case...when 根據值判斷返

MySQL進階14--標識列(序列/auto_increment)--設置/展示步長--設置/刪除標示列

fse cat 修改表 delet 類型 bsp aaa sql 要求 /*進階14 標識列 又稱為自增序列; 含義 : 可以不用手動的插入值, 系統提供默認的序列值(1-->n) 特點 : 1.標識列必須和主鍵搭配? 不一定,但

MySQL資料庫為什麼習慣用序列作為主鍵

對於這個問題需要從MySQL的索引以及儲存引擎談起: InnoDB的primary key為cluster index,除此之外,不能通過其他方式指定cluster index,如果InnoDB不指定primary key,InnoDB會找一個unique not null的field做clus

Mysql資料庫 AUTO_INCREMENT 序列號 跳號處理

Mysql資料庫產生序列號通常使用big int型別,並設定AUTO_INCREMENT為true,這樣每次insert記錄的時候,序列號會自動遞增。 這樣操作基本上沒什麼問題,有個專案甲方提出sid儘量不能跳號,上述處理方式就有問題了,比如:銷售訂單建立: 1)先生成主表記錄,後生成細表記

Oracle建立帶有序列的表字串轉日期的問題

建立Oracle表的sql語句如下: --建立tm_product create table tm_product( pid number(8) primary key not null

MySQL儲存過程定義函式、Navicat for mysql、建立儲存過程函式、呼叫儲存過程函式的區別

與你相遇 好幸運  可我已失去為你淚流滿面的權利  但願在我看不到的天際  你張開了雙翼 1 MySQL儲存過程和函式 過程和函式,它們被編譯後儲存在資料庫中,稱為永續性儲存模組(Persistent Stored Module,PSM),可以反覆呼叫,執行速度快。 1.1 儲存過程 儲存過程是由

一種實現mysql序列的方法

最近工作中遇到一個需求,需要設計一個自增欄位,當每插入一條記錄的時候,該欄位加1,但是由於種種原因,該欄位無法作為primary key存在,這樣就需要該欄位實現為一個自增序列。 mysql中的auto_increment可以實現自增長,其起始值是可以指定的,步長固定就是1

Mysql中的定義函式定義過程

MYSQL中建立儲存過程和函式分別使用CREATE PROCEDURE和CREATE FUNCTION使用CALL語句來呼叫儲存過程,儲存過程也可以呼叫其他儲存過程函式可以從語句外呼叫,能返回標量值建立儲存過程語法CREATE PROCEDURE sp_name ([ pro

Quartz學習——SSMM(Spring+SpringMVC+Mybatis+Mysql)Quartz集成(四)

webapp cron表達式 msi 接口 cli post 定時 報錯 gets Quartz學習——SSMM(Spring+SpringMVC+Mybatis+Mysql)和Quartz集成詳解(四) 當任何時候覺你得難受了,其實你的大腦是在進化,當任何時候你覺得

微擎數據庫緩存的、刪、改查函數

一個 value conf 反序列化 詳解 數據操作 保存 name sea 函數所在文件:framework/function/cache.mysql.func.php目前微擎的個人真實調用:$setting = $this->module['config&

sql表中序列的新增,刪除,與修改

直接 src tar 綁定 後綁定 style com 屬性 新的 首先我們應該對Sequences,有個基本的概念: 主要是用來唯一標識,這樣方便查詢整條數據信息,主要的屬性有:自增量,最大值,最小值,初始值,所有者,自身名稱,關聯表名 1、重新設置序列開始的數字sql,