2011-09-27 81 views

回答

11

MySQL有一个本地函数UUID(),这将产生一个全局唯一标识符:

mysql> SELECT UUID(); 
    -> '6ccd780c-baba-1026-9564-0040f4311e29' 

可以输出存储在CHAR(36)列。

INSERT INTO table (`uuid`, `col1`, `col2`) VALUES (UUID(), 'someval', 'someval'); 

根据尽管文档,

虽然UUID()值打算是独一无二的,它们不一定是难以猜测的或不可预测的。如果需要不可预测性,则应以其他方式生成UUID值。

补遗另一种选择是UUID_SHORT()为64位unsigned INT而不是字符字段。

mysql> SELECT UUID_SHORT(); 
    -> 92395783831158784 
2

组合键是否工作?常规的标准auto_increment字段。您插入新记录,检索其新ID,然后使用salt对该ID进行散列,然后使用该散列值更新记录。

如果您在事务中执行此操作,那么在生成哈希之前,没有哈希的记录的进行中版本将永远不可见。假设你已经完成了适当的腌制,所得到的散列值将用于所有意图和目的“随机”。

请注意,您不能在一个步骤中完成此操作,因为mysql中last_insert_id()的值不会使用新ID更新,直到记录实际写入。在实际的插入分析阶段检索到的值将是在此之前插入的任何id。

1

允许的表定义中唯一自动生成的默认值是自动增量(MySQL Guide)。

您应该可以通过write a trigger自动执行此过程,但可能通过迈克尔建议的UUID功能。

+0

从您的链接的第一条评论CREATE TRIGGER sdata_insert BEFORE INSERT ON sometable FOR EACH ROW BEGIN SET NEW.guid = UUID(); END –

3

既然你问了一招,你可以使用一个共同的auto_incremented ID和“假”与大素乘以(然后模2^32):

CREATE TABLE AutoIncPrime 
(id int unsigned auto_increment primary key 
) ; 

插入值,从1至10:

INSERT INTO AutoIncPrime 
VALUES(),(),(),(),(),(),(),(),(),() ; 

SELECT * FROM AutoIncPrime ; 

输出:

id 
--- 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

假的id,用一种观点:

CREATE VIEW AutoIncPrime_v AS 
    SELECT 
     ((id*1798672429) & 0xFFFFFFFF) 
      AS FakeUUID 
    FROM AutoIncPrime ; 

让我们来看看我们的“的UUID”

SELECT * FROM AutoIncPrime_v ; 

输出:

FakeUUID 
---------- 
1798672429 
3597344858 
1101049991 
2899722420 
403427553 
2202099982 
4000772411 
1504477544 
3303149973 
806855106 

你甚至可以让它看起来更加随意与(更复杂一点的混合) :

CREATE VIEW AutoIncPrime_v2 AS 
    SELECT 
     ( (((id*1798672429) & 0x55555555) << 1) 
      | (((id*1798672429) & 0xAAAAAAAA) >> 1) 
     ) 
     AS FakeUUID 
    FROM AutoIncPrime ; 

SELECT * FROM AutoIncPrime_v2 ; 

FakeUUID 
---------- 
2537185310 
3918991525 
2186309707 
1558806648 
604496082 
1132630541 
3719950903 
2791064212 
3369149034 
808145601 

诀窍是你在表格中仍然有一个顺序标识 - 你可以用它来连接到其他表格。你只是不显示给用户 - 但只显示假的。

如果表是让大和计算速度慢,你可以在表中添加另一列,并用一个INSERT触发器有存储FakeUUID值。

+0

太棒了!我已经考虑过这种方法,但是最糟糕的功能(更复杂,而不是mysql),所以你给我一个指针。但)我无法看到真实的ID(反向方式没有与触发插入它就像你说的),你可以请张贴的这个可爱的功能相反?和b)生成的ID的唯一性如何(当然,在给定的范围内)?我不能确定这个功能的范围是什么,与选定的掩码和素数有关。真的感谢,并请原谅我的英语 –

+0

我会尽量今晚写反向功能。唯一性是有保证的,如果你使用素数,比如'1798672429' :) –