本教學將向您介紹MySQL UUID,並演示如何將其用作表的主鍵(PK),並討論將其用作主鍵的優缺點。
UUID
代表通用唯一識別符號。UUID
是基於」RFC 4122「通用唯一識別符號(UUID
)URN名稱空間」)定義的。
UUID
被設計為在空間和時間全球獨一無二的數位。 預期兩個UUID值是不同的,即使它們在兩個獨立的伺服器上生成。
在MySQL中,UUID
值是一個128
位的數位,表示為以下格式的十五進位制數位的utf8
字串:
aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
要生成UUID
值,請使用UUID()
函式,如下所示:
UUID()
UUID()
函式返回符合RFC 4122
中描述的UUID
版本1的UUID
值。
例如,以下語句使用UUID()
函式來生成UUID
值:
mysql> SELECT UUID();
+--------------------------------------+
| UUID() |
+--------------------------------------+
| 9d6212cf-72fc-11e7-bdf0-f0def1e6646c |
+--------------------------------------+
1 row in set
優點
使用UUID
作為主鍵具有以下優點:
ID
為10
的客戶通過URL: http://www.example.com/customers/10/ 存取他的帳戶,那麼很容易猜到有一個客戶11
,12
等,這可能是攻擊的目標。UUID
值。它也簡化了應用程式中的邏輯。 例如,要將資料插入到父表和子表中,必須首先插入父表,獲取生成的id
,然後將資料插入到子表中。通過使用UUID
,可以生成父表的主鍵值,並在事務中同時在父表和子表中插入行。缺點
除了優勢之外,UUID值也有一些缺點:
WHERE id ='9d6212cf-72fc-11e7-bdf0-f0def1e6646c'
和WHERE id = 10
那個舒服一點?在MySQL中,可以以緊湊格式(BINARY
)儲存UUID值,並通過以下功能顯示人機可讀格式(VARCHAR):
請注意,
UUID_TO_BIN()
,BIN_TO_UUID()
和IS_UUID()
函式僅在MySQL 8.0或更高版本中可用。
UUID_TO_BIN()
函式將UUID從人類可讀格式(VARCHAR
)轉換成用於儲存的緊湊格式(BINARY
)格式,並且BIN_TO_UUID()
函式將UUID從緊湊格式(BINARY
)轉換為人類可讀格式(VARCHAR
)。
如果引數是有效的字串格式UUID
,IS_UUID()
函式將返回1
。 如果引數不是有效的字串格式UUID
,則IS_UUID
函式返回0
,如果引數為NULL
,則IS_UUID()
函式返回NULL
。
以下是MySQL中有效的字串格式UUID
:
aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
aaaaaaaabbbbccccddddeeeeeeeeeeee
{aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee}
我們來看一下使用UUID
作為主鍵的例子。
以下語句建立一個名為customers
的新表:
USE testdb;
CREATE TABLE customers (
id BINARY(16) PRIMARY KEY,
name VARCHAR(255)
);
要將UUID
值插入到id
列中,可以使用UUID()
和UUID_TO_BIN()
函式,如下所示:
INSERT INTO customers(id, name)
VALUES(UUID_TO_BIN(UUID()),'John Doe'),
(UUID_TO_BIN(UUID()),'Will Minsu'),
(UUID_TO_BIN(UUID()),'Mary Jane');
要從UUID列查詢資料,可以使用BIN_TO_UUID()
函式將二進位制格式轉換為可讀取的格式:
SELECT
BIN_TO_UUID(id) id,
name
FROM
customers;
在本教學中,您已經了解了MySQL UUID以及如何將其用於主鍵列。