如何让MySQL在更新/插入之前触发哈希?

4 投票
1 回答
3481 浏览
提问于 2025-04-17 00:00

我在MySQL中创建一个触发器时遇到了困难。我的目标是每次在一个叫做 title 的列中插入值时,自动生成一个哈希值,并把这个哈希值存储在另一个叫做 title_hash 的列里。由于我对这个过程不太了解,所以我在网上找到了以下代码:

CREATE TRIGGER insertModelHash
BEFORE
  INSERT
ON
  products
FOR EACH ROW SET
  NEW.model_hash = CONV(RIGHT(MD5(NEW.products_model), 16), 16, 10)

根据MySQL的参考资料,这段代码的意思是:

  1. 创建一个叫做 insertModelHash 的触发器...
  2. 在向 products 表中插入新行之前...
  3. 对每一行我想插入的 products_model 列使用 MD5, RIGHT, CONV 这些函数。

第三点需要更多解释:

  • 我猜 NEW 是用来标识新行的某种方式。所以 NEW.products_model 指向当前(新)行中的 products_model 列。
  • 接下来使用 MD5 函数。因为我想用SHA-2,所以我觉得把 MD5(NEW.products_model), 16) 改成 SHA2(NEW.products_model), 224) 是很明显的选择。
  • 现在我有点困惑:为什么这个人使用 CONV(RIGHT(...)...)? 这真的有必要吗?

补充信息:现在,我在用

hashlib.sha224(title).hexdigest()

用Python来做这个,并存储这个值。

我很感激任何建议或解释!

1 个回答

5

来回答你的三个问题:

NEW这个关键词指的是一个“伪表”,它代表即将被插入的记录。在更新触发器中,你可以同时访问“NEW”和“OLD”,而在删除操作中,只能访问“OLD”。

是的,MD5用来生成哈希值。不过,在你的问题中,你提到的‘RIGHT’函数的参数部分有点问题。实际上应该是MD5(NEW.products_model)(没有, 16这个部分)。而且,如果可以的话,你可以用SHA2替代MD5(只有在MySQL配置了SSL支持的情况下才能使用SHA2)。

RIGHT(string, number)这个函数的作用是从‘string’中取出最右边的‘number’个字符。CONV()函数则是用来在不同进制之间转换数字。这两个函数结合起来,就是从哈希值中取出最右边的16个字符,并把它们从16进制(十六进制)转换成10进制(十进制)。

最后,答案是,如果你只是想存储哈希值本身,那你不需要这些额外的操作。

  NEW.model_hash = SHA2(NEW.products_model)

撰写回答