MySQL UUID函式和自增序列詳解
MySQL UUID函式的詳解
MySQL中可以有二類用於生成唯一值性質的工具:UUID()函式和自增序列,那麼二者有何區別呢?我們就此對比下各自的特性及異同點:
l 都可以實現生成唯一值的功能;
l UUID是可以生成時間、空間上都獨一無二的值;自增序列只能生成基於表內的唯
一值,且需要搭配使其為唯一的主鍵或唯一索引;
l 實現方式不一樣,UUID是隨機+規則組合而成的,而自增序列是控制一個值逐步增長的;
l UUID產生的是字串型別值,固定長度為:36個字元,而自增序列產生的是整數型別值,長度由欄位定義屬性決定;
接下來,詳細講解下UUID()函式產生的值:
*************************** 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,