2013-10-26 60 views
0

有沒有辦法讓mysql對其表的自動增量值進行散列值? 例如與md5?如何在mysql中散列自動增量值

 
    id - name 
    1 - New York 
    2 - Chicago 
    3 - Sydney  
    4 - Berlin  

什麼,我試圖讓

 
    id - name 
    c4ca4238a0b923820dcc509a6f75849b - New York 
    c81e728d9d4c2f636f067f89cc14862c - Chicago 
    eccbc87e4b5ce2fe28308fd9f2a7baf3 - Sydney  
    a87ff679a2f3e71d9181a67b7542122c - Berlin  

在此先感謝

編輯:

我想我需要澄清的問題多一點,想什麼即時通訊do不是調用ID的,而是插入它們。在ID列是一個int字段,我將更改爲varchar。

我想將標識符保存爲數據庫中的哈希,而不是使用mysql SELECT調用它們。現在,除了(),其 在內部表示爲CURRENT_TIMESTAMP的代名詞 - 感謝

回答

5

如果你真的需要這個,因爲某些原因,你可以用測序一個單獨的表的幫助和BEFORE觸發

表模式實現它:

CREATE TABLE table1_seq 
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY); 
CREATE TABLE table1 
(id VARCHAR(32) NOT NULL DEFAULT 0, name VARCHAR(32)); 

觸發

DELIMITER $$ 
CREATE TRIGGER tg_bi_table1 
BEFORE INSERT ON table1 
FOR EACH ROW 
BEGIN 
    INSERT INTO table1_seq() VALUES(); 
    SET NEW.id = MD5(LAST_INSERT_ID()); 
END$$ 
DELIMITER ; 

現在您可以將行插入到您的table1表中

INSERT INTO table1 (`name`) VALUES ('New York'),('Chicago'),('Sydney'),('Berlin'); 

,或者選擇

SELECT * FROM table1 WHERE id = MD5(2); 

這裏是上述SQLFiddle演示

+0

這會幫助我很多,感謝分享! –

+0

你可以請檢查小提琴演示。它沒有顯示任何東西 –

+0

@KapilPaul它是sqlfiddle方面的問題 – peterm

1

MySQL文檔說..

函數不能添加列缺省值。

一個最好的選擇將做到這一點...

UPDATE yourtablename SET id=MD5(id) WHERE 1=1; 

或運行TRIGGER

喜歡的東西...(不是100%正確...只是給你一個想法

CREATE TRIGGER generateMD5forID BEFORE INSERT ON `yourtablename` FOR EACH ROW SET id = MD5(id); 
+0

不幸的是,在BEFORE觸發器中,id列沒有被賦予一個自動增量值。但是在AFTER觸發器中更改它爲時已晚。此外,您不能使VARCHAR列自動遞增,它必須是整數類型之一。但是,如果它是一個整數,則不能在其中存儲一串十六進制數字。 –

+0

謝謝比爾。你是對的。這就是爲什麼我把這個聲明放在斜體裏面,因爲我不確定這是否真的有效。 –

1

Ma ybe我不明白這個問題,但這是我的意見:

我想你嘗試創建一個哈希表。因此插入ID字段作爲你的數據的散列(md5(name))。

但是,如果沒有,插入後使用表觸發器來生成字段散列。

+0

我喜歡使用唯一字段作爲標識符的想法,比如.. md5(name),但這意味着我需要重新設計整個程序,這會花費太多時間。我喜歡觸發想法,但沒有太多的經驗。稍後我會試驗它,並嘗試將它與我在此發佈的自己的解決方案結合起來,如果這樣的事情是可能的話......但總而言之感謝答覆。 –

0

這裏的答案提出了一個想法在我..我認爲這將作爲現在最好的解決方案..但如果有人知道一個更簡單的方法,我很高興聽到它。

解決方案:

與像ID自動遞增字段創建一個新表或計數,你總是會增加第一和利用最後的ID從該表的散列它的主要領域的其他表。

0

一切答案缺乏必要使用散列ID的一個很好的理解。

散列自動增量ID違反了整個概念。 你想要達到的概念是,下一個ID將從以前的不可預知的。

在散列id的想法中,md5(1)的下一個id是md5(2)。

如果您使用有助於的名稱。

最好從幾個字段創建散列。 這些字段應該是唯一的,以創建獨特的散列。