0

有没有办法让 mysql 散列其表的自动增量值?比如md5?

    身份证 - 姓名
    1 - 纽约  
    2 - 芝加哥   
    3 - 悉尼    
    4 - 柏林    

我想要得到什么

    身份证 - 姓名
    c4ca4238a0b923820dcc509a6f75849b - 纽约  
    c81e728d9d4c2f636f067f89cc14862c - 芝加哥   
    eccbc87e4b5ce2fe28308fd9f2a7baf3 - 悉尼    
    a87ff679a2f3e71d9181a67b7542122c - 柏林    

提前致谢

编辑:

我想我需要再澄清一下这个问题,我想做的不是调用 ID,而是插入它们。目前,ID 列是一个 int 字段,我将其更改为 varchar。

我想将标识符保存为数据库中的哈希,而不是用 mysql SELECT 调用它们。谢谢

4

5 回答 5

6

如果你真的需要这个,出于某种原因,你可以借助一个单独的排序表和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演示

于 2013-10-27T07:55:50.047 回答
1

MySQL医生说..

不能将函数添加为 COLUMN DEFAULTS - 除了 now(),它在内部表示为 CURRENT_TIMESTAMP 的同义词。

最好的办法是这样做......

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);
于 2013-10-26T18:23:07.387 回答
1

也许我不明白这个问题,但这是我的看法:

我认为您尝试创建一个哈希表。因此,插入 id 字段作为数据的哈希(md5(名称))。

但如果没有,请在插入后使用表触发器生成字段哈希。

于 2013-10-26T18:23:48.357 回答
1

上面的所有答案都缺乏对使用散列 ID 的需要的很好理解。

散列自动增量 id 违反了整个概念。您想要达到的概念是下一个 id 将与前一个相比是不可预测的。

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

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

最好从多个字段创建散列。这些字段一起应该是唯一的,以创建唯一的哈希。

于 2018-01-15T15:13:43.477 回答
0

这里的答案在我身上提出了一个想法。我认为这将是目前最好的解决方案。但如果有人知道更简单的方法,我很高兴听到它。

解决方案:

创建一个具有自动递增字段(如 id 或 count)的新表,您将始终先递增该字段并使用该表中的最后一个 ID 将其散列为其他表的主字段。

于 2013-10-26T18:57:38.597 回答