2013-10-26 31 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)。

如果您使用有助于的名称。

最好从几个字段创建散列。 这些字段应该是唯一的,以创建独特的散列。