2011-09-27 42 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' :) –