MySQL - UUID
MySQL UUID 函数
MySQL UUID() 函数用于根据 RFC 4122 生成"通用唯一标识符"(UUID)。UUID 被设计为全局唯一,即使在不同的服务器上生成也是如此。 UUID 由当前时间戳、服务器唯一标识符和随机数组合生成。
UUID 格式
UUID 值以 UTF-8 字符串表示,是一个 128 位的数字。 UUID 值的格式为十六进制数,由五段组成,每段之间用连字符分隔。
UUID 值的通用格式为:aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee,其中每段代表一个十六进制值。
生成 UUID
以下是使用 MySQL 中的 UUID() 函数生成 UUID 的基本示例 -
SELECT UUID();
输出
它将显示一个通用唯一标识符,如下所示 -
UUID() |
---|
55f7685d-e99c-11ed-adfc-88a4c2bbd1f9 |
生成多个 UUID
您可以在单个查询中生成多个 UUID,每个 UUID 都将不同,如下所示 -
SELECT UUID() AS ID1, UUID() AS ID2;
输出
输出将显示两个不同的 UUID,差异通常出现在第一段中 -
ID1 | ID2 |
---|---|
78c3fb43-e99c-11ed-adfc-88a4c2bbd1f9 | 78c3fb4f-e99c-11ed-adfc-88a4c2bbd1f9 |
数据库表中的 UUID
您可以将 UUID 用作数据库表中的唯一标识符。以下是如何创建包含 UUID 列的表并插入数据的示例 -
首先,我们创建一个名为"ORDERS"的表,并使用以下查询创建 VARCHAR 类型的 ORDER_ID 列 -
CREATE TABLE ORDERS( ID int auto_increment primary key, NAME varchar(40), PRODUCT varchar(40), ORDER_ID varchar(100) );
现在,我们将数据插入到 ORDERS 表中,使用 UUID() 函数为 ORDER_ID 列生成唯一值 -
INSERT INTO ORDERS (NAME, PRODUCT, ORDER_ID) VALUES ("Varun", "Headphones", UUID()); INSERT INTO ORDERS (NAME, PRODUCT, ORDER_ID) VALUES ("Priya", "Mouse", UUID()); INSERT INTO ORDERS (NAME, PRODUCT, ORDER_ID) VALUES ("Nikhil", "Monitor", UUID()); INSERT INTO ORDERS (NAME, PRODUCT, ORDER_ID) VALUES ("Sarah", "Keyboard", UUID()); INSERT INTO ORDERS (NAME, PRODUCT, ORDER_ID) VALUES ("Vaidhya", "Printer", UUID());
以下是获得的 ORDERS 表 -
ID | NAME | PRODUCT | ORDER_ID |
---|---|---|---|
1 | Varun | Headphones | a45a9632-e99d-11ed-adfc-88a4c2bbd1f9 |
2 | Priya | Mouse | a45b03a3-e99d-11ed-adfc-88a4c2bbd1f9 |
3 | Nikhil | Monitor | a45b49cc-e99d-11ed-adfc-88a4c2bbd1f9 |
4 | Sarah | Keyboard | a45b8d3f-e99d-11ed-adfc-88a4c2bbd1f9 |
5 | Vaidhya | Printer | a4b003d0-e99d-11ed-adfc-88a4c2bbd1f9 |
修改 UUID
您可以修改 UUID 而不会丢失其唯一性。例如,您可以使用 REPLACE() 和 TO_BASE64() 等函数删除连字符或将其转换为 base64 表示法。
示例
此处,我们使用以下查询更新 ID = 1 的记录的 UUID 值 -
UPDATE ORDERS SET ORDER_ID = UUID() WHERE ID=1;
输出
以下是上述代码的输出 -
Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0
验证
要验证修改后的 UUID 值,我们可以使用以下 SELECT 查询 -
SELECT * FROM ORDERS;
正如我们在下面的输出中看到的,每次执行 UUID() 函数时,我们都会得到不同的 UUID 值 -
ID | NAME | PRODUCT | ORDER_ID |
---|---|---|---|
1 | Varun | Headphones | 38f4d94a-e99d-11ed-adfc-88a4c2bbd1f9 |
2 | Priya | Mouse | a45b03a3-e99d-11ed-adfc-88a4c2bbd1f9 |
3 | Nikhil | Monitor | a45b49cc-e99d-11ed-adfc-88a4c2bbd1f9 |
4 | Sarah | Keyboard | a45b8d3f-e99d-11ed-adfc-88a4c2bbd1f9 |
5 | Vaidhya | Printer | a4b003d0-e99d-11ed-adfc-88a4c2bbd1f9 |
示例
假设之前创建了表,我们使用 REPLACE() 函数从 ID = 2 的行的 UUID 中删除连字符,如下所示 -
UPDATE ORDERS SET ORDER_ID = REPLACE(UUID(), '-', '') WHERE ID = 2;
输出
上述代码的输出如下 -
Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0
验证
要验证修改后的 UUID 值,我们可以使用以下 SELECT 查询 -
SELECT * FROM ORDERS;
正如我们在下面的输出中看到的那样,第 2 行的 UUID 被修改,而没有影响其"唯一"部分 -
ID | NAME | PRODUCT | ORDER_ID |
---|---|---|---|
1 | Varun | Headphones | a45a9632-e99d-11ed-adfc-88a4c2bbd1f9 |
2 | Priya | Mouse | 069b0ca-7e99e11ed-adfc-88a4c2bbd1f9 |
3 | Nikhil | Monitor | a45b49cc-e99d-11ed-adfc-88a4c2bbd1f9 |
4 | Sarah | Keyboard | a45b8d3f-e99d-11ed-adfc-88a4c2bbd1f9 |
5 | Vaidhya | Printer | a4b003d0-e99d-11ed-adfc-88a4c2bbd1f9 |
示例
在以下查询中,我们使用 TO_BASE64() 函数将 ID = 4 的 UUID 转换为 base64 表示法 -
UPDATE ORDERS SET ORDER_ID = TO_BASE64(UNHEX(REPLACE(UUID(),'-',''))) WHERE ID=4;
输出
生成的结果如下 -
Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0
验证
我们使用以下 SELECT 查询来验证修改后的 UUID 值 -
SELECT * FROM ORDERS;
生成的输出如下所示 -
ID | NAME | PRODUCT | ORDER_ID |
---|---|---|---|
1 | Varun | Headphones | a45a9632-e99d-11ed-adfc-88a4c2bbd1f9 |
2 | Priya | Mouse | 069b0ca7-e99e11ed-adfc-88a4c2bbd1f9 |
3 | Nikhil | Monitor | a45b49cc-e99d-11ed-adfc-88a4c2bbd1f9 |
4 | Sarah | Keyboard | ObRYA+mfEe2t/IikwrvR+Q== |
5 | Vaidhya | Printer | a4b003d0-e99d-11ed-adfc-88a4c2bbd1f9 |