如何让MySQL在更新/插入之前触发哈希?
我在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的参考资料,这段代码的意思是:
- 创建一个叫做
insertModelHash
的触发器... - 在向
products
表中插入新行之前... - 对每一行我想插入的
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)